фиксированной точности с плавающей типы точек, те, изначально поддерживается ваш центральный процессор с плавающей точкой (float
, double
, real
) не являются оптимальными для любых вычислений, для которых требуется много цифр точности, например, пример, который вы указали.
Проблема состоит в том, что эти типы с плавающей точкой имеют конечное число цифр точности (фактически двоичные цифры), которые ограничивают длину числа, которое может быть представлено таким типом данных. Тип float
имеет предел приблизительно 7 десятичных цифр (например, 3.141593); тип double
ограничен 14 (например, 3.1415926535898); и тип real
имеет аналогичный предел (немного больше, чем у double
).
Добавление чрезвычайно малых чисел к значению с плавающей запятой приведет к тому, что эти цифры будут потеряны. Смотрите, что происходит, когда мы добавим следующие два значения с плавающей точкой вместе:
float a = 1.234567f, b = 0.00000000
float c = a + b;
writefln("a = %f b = %f c = %f", a, b, c);
Оба a
и b
являются допустимыми значениями с плавающей точкой и удерживать около 7 цифр точности поштучно в изоляции. Но при добавлении только самые верхнее 7 цифр сохраняются, так как она становится засунули обратно в поплавок:
1.23456700=> 1.234567|00=> 1.234567
^^^^^^^^^^^
sent to the bit bucket
Так c
заканчивается равный a
, поскольку тонкие цифры точности от добавления a
и b
просыпаются от ,
Here's another explanation of the concept, вероятно, намного лучше, чем мой.
Ответ на эту проблему - арифметика произвольной точности. К сожалению, поддержка арифметики произвольной точности не в аппаратном обеспечении ЦП; следовательно, это не (обычно) на вашем языке программирования. Тем не менее, существует множество библиотек, которые поддерживают типы с плавающей точкой произвольной точности и математику, которую вы хотите выполнить на них. См. this question для некоторых предложений. Вы, вероятно, сегодня не найдете для этого D-специфических библиотек, но есть много библиотек C (GMP, MPFR и т. Д.), Которые должны быть достаточно легкими для использования изолированно, и тем более, если вы можете найти D для одного из них.
отличный .. я попробую! – NaN