Я изучаю почему тестовый пример не работает
Проблематичный тест может быть сведен к выполнению (4.0/9.0) ** (1.0/2.6)
, округляя его до 6 цифр и проверять на известное значение (в виде строки):
#include<stdio.h>
#include<math.h>
int main(){
printf("%.06f\n", powf(4.0/9.0, (1.0/2.6)));
}
Если я скомпилирую и запустил это в gcc 4.1.2 в Linux, я получаю:
0.732057
Python соглашается, как и Wolfram | Alpha:
$ python2.7 -c 'print "%.06f" % (4.0/9.0)**(1/2.6)'
0.732057
Однако я получаю следующий результат по gcc 4.4.0 в Linux и 4.2.1 на OS X:
0.732058
A double
действует тождественно (хотя я не тестировал это подробно)
Я не уверен, как сузить это дальше. Это регрессия gcc? Изменение алгоритма округления? Я делаю что-то глупое?
Изменить: Распечатка результата до 12 цифр, цифра на 7-м месте - 4 против 5, что объясняет разницу округления, но не разницу значений:
gcc 4.1.2:
0.732057452202
gcc 4.4.0:
0.732057511806
Здесь gcc -S
вывод из обеих версий: https://gist.github.com/1588729