Мне интересно, где происходит числовая ошибка, на каком уровне. Поясню на примере:pow numeric error in c
int p = pow(5, 3);
printf("%d", p);
Я тестировал этот код на различных HW и компиляторов (VS и GCC), а некоторые из них распечатать 124, а некоторые из 125.
- На то же HW (OS) я получаю разные результаты в разных компиляторах (VS и GCC).
- На разных HW (OS) я получаю разные результаты в одном и том же компиляторе (cc (GCC) 4.8.1).
AFAIK, pow вычисляет до 124.99999999, и это усекается до int, но где эта ошибка? Или, другими словами, где происходит коррекция (124.99-> 125)
Является ли это компилятором-HW-взаимодействие?
// ****** отредактирован:
Вот дополнительный фрагмент, чтобы играть с (держать глаз на р = 5, р = 18, ...):
#include <stdio.h>
#include <math.h>
int main(void) {
int p;
for (p = 1; p < 20; p++) {
printf("\n%d %d %f %f", (int) pow(p, 3), (int) exp(3 * log(p)), pow(p, 3), exp(3 * log(p)));
}
return 0;
}
Значения с плавающей точкой на компьютерах являются сложным делом, а результаты операций над ними зависят от многих факторов. Например, поддержка аппаратного обеспечения (если таковая имеется), алгоритмы округления, используемые различным программным обеспечением (компиляторы, стандартные библиотеки) или аппаратное обеспечение, и многое другое. –
Также следует помнить, что при использовании константных выражений компилятор часто будет использовать [встроенные функции] (http://stackoverflow.com/a/24294632/1708801), и поэтому вы также можете попробовать это с помощью '-fno-builtin' для посмотрите, влияет ли это на результаты. –
Я считаю, что это не так, я только что добавил фрагмент, используя цикл for, и то же самое происходит. – igorludi