Я пытался понять, как разные языки обрабатывают числа с плавающей запятой. Я знаю, что есть некоторые неотъемлемые вопросы в представление с плавающей запятой, поэтому, если вы делаете 0,3 + 0,6 в Python, вы получите 0.899999, а не 0,9Does printf() изменить свои параметры?
Однако эти фрагменты кода просто оставили меня изумлен:
double x = 0.1,
sum = 0;
for(int i=0; i<10; ++i)
sum += x;
printf("%.9lf\n",sum);
assert(sum == 1.0);
Вышеупомянутый фрагмент работает отлично. Он печатает 1.0. Однако, следующий фрагмент кода дает ошибку во время выполнения:
double x = 0.1,
sum = 0;
for(int i=0; i<10; ++i)
sum += x;
assert(sum == 1.0);
printf("%.9lf\n",sum);
Единственное изменение в двух фрагментах выше порядок и утверждают PRINTF заявления. Это заставляет меня думать, что printf каким-то образом модифицирует свои аргументы и как-то округляет их.
Может кто-нибудь, пожалуйста, проливает свет на это?
Попробуйте ввести 16 цифр вместо 9. –
Пожалуйста, никогда не обращайтесь за помощью к ошибке, которую вы получаете, не беспокоясь о том, какую ошибку вы получаете. Это безумие. –
Это, похоже, еще один пример того, как не понимать, как работают числа с плавающей запятой. Бросьте на это недоразумение printf, и у вас есть беспорядок. – duffymo