Сколько цифр вы считаете нужным?У вас одинаковые первые 16 цифр каждого числа равны, что является приблизительным количеством данных, которые double
обычно могут представлять и хранить внутри.Вы не можете получить больше, даже если вы заставите свои процедуры печати печатать больше цифр, они будут печатать мусор.То, что происходит, это то, что вы сказали, чтобы получить, скажем, 120 цифр на ваши процедуры печати ... и они будут печатать их, как правило, умножая остаток (что бы это ни было). Поскольку числа представлены в базе 2, вы обычно не получаетенули однажды прошли внутреннюю прецизионность числа ... и реализациям печати не нужно согласовывать напечатанные цифры, если у вас больше цифр не представлено в вашем номере.
Предположим, вы на мгновениеиметь ручной калькулятор, который имеет только 10 цифр точности.И вам даны цифры из 120 цифр.Вы начинаете вычислять и получаете результаты только с 10 цифрами ... но вас попросили напечатать отчет с результатами из 120 цифр.Ну .... так как общий расчет не может быть сделан с более чем 10 цифрами, что вы можете сделать?Вы используете калькулятор, который не может дать вам требуемое количество цифр ... и более того, число из 10 базовых цифр в 52-битном значении не является целым числом цифр (в 52-битном значении есть 15.65355977452702215111442252567364
десятичных цифр и),Что вы можете сделать, вы можете заполнить нулями (неверно, скорее всего), вы можете заполнить эти места рубинами (что никогда не повлияет на конечный 10-значный результат) или вы можете пойти в Radio Shack и купить 120-значный калькулятор.Процедуры печати с плавающей запятой используют счетчик, чтобы указать, сколько раз зайти в цикл и получить другую цифру, они обычно останавливаются, когда счетчик достигает своего предела, но не прилагают никаких дополнительных усилий, чтобы узнать, сошли ли вы с ума и указалибольшое количество цифр ... если вы попросите 600 цифр, вы просто получите 600 итераций цикла, но цифры будут поддельными.
Вы должны ожидать разницу в одной части в 2^52
в double
число, так как это число двоичных цифр, используемых для значимого (это приблизительно 1009 *, поэтому вам нужно умножить это число на число, которое вы вывели, чтобы увидеть, насколько велика ошибка округления, приблизительно), если вы умножаетечисло 663.792187417201375865261070430279
тем самым вы получите 1.473914740073748177152126604805902e-13
, который является оценкой того, где в числе находится последняя действительная цифра этого числа.Вероятно, оценка ошибки будет намного больше из-за большого количества умножений и сумм, необходимых для вычисления ячейки.В любом случае разрешение 1.0e-13
очень хорошее (субатомное различие, если значения будут длинами и единицами в метрах).
РЕДАКТИРОВАТЬ
в качестве примера, просто рассмотрите следующую программу:
#include <stdio.h>
int main()
{
printf("%.156f\n", 0.1);
}
если вы запустите его, вы получите:
0.100000000000000005551115123125782702118158340454101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
, что действительно является наиболее (точным) приближением к внутреннему представлению числа 0.1
, которое может представлять машинав базе 2 с плавающей запятой (0.1
является периодическим числом, если оно представлено в базе 2). Его представление:
0.0001100110011(0011)*
, поэтому оно не может быть точно представлено 52 битами, повторяющими шаблон 1100
на неопределенный срок.В какой-то момент вы должны сократить, и подпрограмма printf
продолжает добавлять нули вправо, пока не дойдет до представленного выше представления (все конечные цифры в базе 2 представляются в виде конечного числа цифр в базе 10, нообратное неверно (потому что все факторы 2 в 10, но не все факторы 10 в 2).
Если вы поделите разницу между 0.1
и 0.1000000000000000055511151231257827021181583404541015625
между 0.1
вы получите 5.55111512312578270211815834045414e-17
, что составляет примерно 1/2 ^ 54 или одну четверть (примерно одну пятую) от лимита 1/2^52
, который я показал вам выше. Это самое близкое число, представимое с 52 битами от числа 0.1