Я знаю, что значения с плавающей запятой ограничены в числах, которые могут выражаться точно, и я нашел много сайтов, которые описывают, почему это происходит. Но я не нашел никакой информации о том, как эффективно решать эту проблему. Но я уверен, что НАСА не в порядке с 0.2/0.1 = 0.199999. Пример:Неточности с плавающей запятой в c
#include <stdio.h>
#include <float.h>
#include <math.h>
int main(void)
{
float number = 4.20;
float denominator = 0.25;
printf("number = %f\n", number);
printf("denominator = %f\n", denominator);
printf("quotient as a float = %f should be 16.8\n", number/denominator);
printf("the remainder of 4.20/0.25 = %f\n", number - ((int) number/denominator)*denominator);
printf("now if i divide 0.20000 by 0.1 i get %f not 2\n", (number - ((int) number/denominator)*denominator)/0.1);
}
выход:
number = 4.200000
denominator = 0.250000
quotient as a float = 16.799999 should be 16.8
the remainder of 4.20/0.25 = 0.200000
now if i divide 0.20000 by 0.1 i get 1.999998 not 2
Так как я делаю арифметику с плавающей точкой (или знаков после запятой или два раза) и получить точные результаты. Надеюсь, я не просто пропустил что-то сверх очевидное. Любая помощь была бы потрясающей! Благодарю.
Довольно точно, что NASA не использует переменные 'float' для межпланетной навигации. Однако они могут использовать «double». Если вы настроили сетку с центром на солнце и простираетесь до Марса, разрешение сетки составляет около 50 микрон (используя «double» для значений x, y, z). Таким образом, «двойник» достаточно хорош для навигации на Марс. И именно так люди справляются с этим. Изучите ваши требования и выберите подходящий инструмент для работы. Если 'float' недостаточно хорош, используйте' double'. Если 'double' недостаточно хорош, вам понадобится библиотека расширенной точности. – user3386109
'double' следует использовать по умолчанию, а не' float'. Вот почему литералы с плавающей запятой без суффикса 'f' будут' double' –
Довольно уверены, что NASA в порядке с числами с плавающей запятой, если ваш алгоритм численно стабилен. Существует целая область исследования под названием «численный анализ», которая посвящена пониманию проблем, связанных с точностью численных алгоритмов и ошибок округления. Однако, если вы пишете '0,2/0,1', вы должны * всегда * получить' 2.0', точно. Если вы не получите '2.0' именно тогда, вы не начали с правильно округленных версий' 0,2' и '0,1', вы начали с чего-то другого. Причина, по которой вы не получаете '2.0', на самом деле потому, что' 4.2 - 4.0! = 0.2' - вот где ошибка. –