printf("%.0lf\n", x);
не требуется, чтобы напечатать точное значение (double) x
.
Совместимый компилятор C/стандартная библиотека C сгенерирует код, который напечатает около DBL_DECIMAL_DIG
(обычно 17) с правильными значащими десятичными цифрами. Другие могут правильно печатать больше цифр. (Мой напечатан 9223372036854775808
). См. <float.h>
// 45678901234567
9223372036854775800 // answer
9223372036854775808 // true answer:
Экстремальный пример
DBL_MAX
может иметь точное значение
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Тем не менее, многие результаты printf("%.0lf\n" ,DBL_MAX);
будут содержать нули после определенного момента.
179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
OP позже добавил, что эталонная функция pow()
была long long int pow(long long int a, long long int b)
. Ожидается, что pow_ll_version(2,63)
приведет к 9223372036854775808
, то есть 1 передал много LLONG_MAX
- безусловно, неопределенное поведение. Предположим, что он обернут в -9223372036854775808
и напечатан с printf("%llu\n" , long_long_int_result);
(больше UB из-за несоответствия спецификатора и типа). Это могло дать 9223372036854775808
OP.
printf()
вывод целых чисел точен, а не значений с плавающей запятой.
person
chux - Reinstate Monica
schedule
23.03.2017
pow(long long int a, long long int b)
примере? - person chux - Reinstate Monica   schedule 23.03.2017double
обычно использует 12 бит для знака и экспоненты, оставляя 52 (фактически 53) бита для хранения мантиссы. В то время как 2 ^ 63 имеет только 1 двоичный бит, при многократном делении на 10 для создания двоичного представления вы постепенно используете больше битов, и вы можете начать сталкиваться с проблемами, требуя больше битов для точного представления оставшегося значения. Я не уверен, что это причина, но есть пределы точности всех этих вещей. - person Jonathan Leffler   schedule 24.03.2017