Сразу предупреждаю, что это сложная задача.
Есть тест. Тест стал результатом разбора большой проблемы на баг, с которым мы столкнулись в работе. Конструкция __ attribute__((noinline))
запрещает компилятору делать подстановочную функцию (для оптимизации, чтобы что-то там не взорвалось). Это самый простой способ оптимизации, гарантированно не убивающий интересную ситуацию.
#include <stdio.h>
double d = 5436277361664796672.000000;
long long ll = 5436277361664796253LL;
int __attribute__((noinline))
func1 (void)
{
double d1 = (double)ll;
if (d > d1)
return 1;
else
return 0;
}
int __attribute__((noinline))
func2 (void)
{
if (d > (double)ll)
return 1;
else
return 0;
}
int
main (void)
{
printf ("%d %d\n", func1(), func2());
return 0;
}
Я провел этот тест на intel
и sparc
. Gcc
используется в режиме с оптимизацией и без оптимизации. Получил следующие результаты:
sparc: "gcc" printed "0 0"
sparc: "gcc -O2" printed "0 0"
intel: "gcc" printed "0 1"
intel: "gcc -O2" printed "1 1"
В чем причина различий? Так или иначе при разборе ситуации было бы полезно иметь возможность все это повторить самому, но, конечно, практически ни у кого нет возможности запустить этот код на sparc
. Вместо этого sparc
можно попробовать запустить под Windows с помощью microsoft or borland C compiler
. Я не знаю, какие им будут выданы результаты, но в любом случае что-то ни с чем не совпадает (потому что мы видим три разных результата)
Редактировать 1 _атрибут_ ((noinline)) — расширение компилятора gcc (забыл написать об этом). Поэтому VisualStudio не может его скомпилировать.