Java и C с плавающей запятой :«x *x» отличается от «pow (x,2 )»?

Почему это так? Кажется, что Java дает результат с небольшим расхождением при умножении двух чисел с плавающей запятой по сравнению с C и даже с методом Java Math.pow.

Java:

float a = 0.88276923;

double b = a * a;   // b becomes 0.779281497001648  <---- what???
b = Math.pow(a,2);  // b becomes 0.7792815081874238

C:

float a = 0.88276923;

double b = a * a;   // b becomes 0.7792815081874238
pow(a,2);           // b becomes 0.7792815081874238

Обновление :Согласно комментарию Эда С., я также обнаружил, что поведение C меняется в зависимости от компилятора. Использование gcc, похоже, соответствует поведению Java. Использование Visual Studio (в зависимости от вашей целевой платформы )может привести к результатам, показанным выше, или к результатам, наблюдаемым в Java. Фу.

18
задан mskfisher 9 May 2012 в 16:27
поделиться