Всем здравствуйте.
Народ, помогите разобраться с вычислительной техникой.
Мне нужно написать вычислительную процедуру на C, где нужно изменять некоторый параметр p от 1 до ... в задании загадочная формулировка "до нештатной реакции компьютера"
Поскольку параметр p будет иметь тип double, то я решил изменять его до нижней границы минимального диапазона double, который определен в C89: 10 ^ -37.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double p;
for (p = 1; p > 1E-37; p *= 0.1) {
printf("%38.37f\n", p);
}
return (EXIT_SUCCESS);
}
Вывод меня удивил:
1.0000000000000000000000000000000000000
0.1000000000000000055511151231257827021
0.0100000000000000019428902930940239457
0.0010000000000000002376571162088225719
0.0001000000000000000318972279145235404
0.0000100000000000000042061623281575145
0.0000010000000000000003782645854530364
0.0000001000000000000000484143703859824
0.0000000100000000000000051723092836195
0.0000000010000000000000004758718977343
0.0000000001000000000000000553420080161
0.0000000000100000000000000058573182284
0.0000000000010000000000000005857318228
0.0000000000001000000000000000661462470
0.0000000000000100000000000000078768021
0.0000000000000010000000000000008665663
0.0000000000000001000000000000000965174
0.0000000000000000100000000000000099599
0.0000000000000000010000000000000010345
0.0000000000000000001000000000000001059
0.0000000000000000000100000000000000115
0.0000000000000000000010000000000000012
0.0000000000000000000001000000000000001
0.0000000000000000000000100000000000000
0.0000000000000000000000010000000000000
0.0000000000000000000000001000000000000
0.0000000000000000000000000100000000000
0.0000000000000000000000000010000000000
0.0000000000000000000000000001000000000
0.0000000000000000000000000000100000000
0.0000000000000000000000000000010000000
0.0000000000000000000000000000001000000
0.0000000000000000000000000000000100000
0.0000000000000000000000000000000010000
0.0000000000000000000000000000000001000
0.0000000000000000000000000000000000100
0.0000000000000000000000000000000000010
0.0000000000000000000000000000000000001
55511151231257827021 - это уже не значащие цифры? Похоже на то, потому что они везде разные. Как определить, что цифра является значащей? По стандарту их должно быть не менее 10, тут 17 - замечательный результат.
Что интересно, и gcc, и cc (компилятор C из коллекции SunStudio) дают абсолютно одинаковый результат.
Как определить диапазон для конкретного компилятора, чтобы не отталкиваться от минимального диапазона C89?
Заранее спасибо.