2015-06-11 4 views
4

Как воспроизвести это поведение? https://isocpp.org/wiki/faq/newbie#floating-point-arith2Как воспроизвести с плавающей запятой cos (x)! = Cos (x)

Чтобы быть точным, в следующем коде, параметры x и y равны; они могут быть равны 1,0 или любому другому значению.

void foo(double x, double y) 
{ 
    double cos_x = cos(x); 
    double cos_y = cos(y); 
    // the behavior might depend on what's in here 
    if (cos_x != cos_y) { 
    std::cout << "Huh?!?\n"; // You might end up here when x == y!! 
    } 
} 

Некоторые параметры компилятора? Loop? Есть идеи?

+0

Вы не можете. Все зависит от вашей конфигурации относительно того, что происходит. вот почему есть комментарий '// Вы можете оказаться здесь, когда x == y !!' – NathanOliver

+0

Попробуйте высокоточное (чтение: _very long_) число, которое вы можете напечатать со многими десятичными знаками и посмотреть, что произойдет. –

+1

Вам понадобится старая версия вашего компилятора C, которая все еще генерирует код FPU с ужасным 80-битным внутренним форматом и достаточную энергию для обработки кода, чтобы оптимизатор нарушил его. Это неделя вашей жизни, которую ты никогда не вернешь. Дело в том, что это может произойти без необходимости искать его. –

ответ

3

Я бы попытался сделать это так, как это делается в связанном примере: без сохранения результатов во временные переменные. В статье упоминается, что арифметика с плавающей запятой часто вычисляется в регистрах, которые имеют больше бит, чем оперативная память. Если есть, например, только один арифметический регистр с плавающей запятой, то после выполнения вычисления cos результат должен быть сохранен в ОЗУ, чтобы выполнить другой расчет cos. Из статьи:

Предположим, что ваш код вычисляет cos (x), затем обрезает этот результат и сохраняет его во временную переменную, например tmp. Затем он может вычислить cos (y) и (барабан рулон, пожалуйста) сравните необработанный результат cos (y) с tmp, т. Е. С усеченным результатом cos (x).

При сохранении оба результата в переменных (в зависимости от оптимизации, и т.д.) есть хороший шанс, что результат второго cos расчета также будет храниться в памяти перед вычислением. Так как результаты будут усечены одинаково, они будут сравниваться как ==.

 Смежные вопросы

  • Нет связанных вопросов^_^