Истеричка
Истеричка

Вопрос по информатике. Почему точность вычислений в С определяется только 16 знаком после запятой и почему именно 16?

для зачета по информатике препод задал вопрос
типа почему если я в программе буду задавать точность вычислений с большим чем 16 количество цифр после запятой, то компьютер будет округлять? почему именно 16?

Танюся Власова
Танюся Власова

Си в этой "точности" совершенно ни при чём. Речь идёт о представлении вещественных чисел двойной точности в сопроцессоре от Intel.
53 - это разрядность двоичной нормализованной мантиссы, что обеспечивает точность в десятичном представлении 15-16 десятичных разрядов
тип double имеет распределение знак, порядок, дробная часть мантиссы: 1+11+52=64 бита
поэтому нормализованная мантисса имеет 2^(52+1) двоичных вариантов представления значения вещественного числа
lg(2^(52+1))=15,9546 что почти равно 16, но не равно!
А это значит, что гарантированно азличить можно только 15 десятичных цифр, а не 16!

MV
Mihail Vologin

эм.... ты же про float говоришь, да?

СЛ
Сергей Леонов

Потому что мантисса ограничена 53 разрядами. 1/(2^-53) =1,1102230246251565404236316680908e-16
В IEEE 754 double занимает 52 разряда за счет отбрасывания старшей 1,которая всегда равна 1, поэтому в моей формуле выше 53.

Александр Немчинов
Александр Немчинов

Ну тебе почти ответили, особенно про 15 значащих.
Из своего опыта нарывания на эту жопу могу сказать, что никогда не используй тип float - целее будешь, так как даже 7 значащих цифр не хватает при многократных операциях.
И про сравнение таких чесел тоже толково сказали http://www.mql5.com/ru/docs/basis/types/double
так как "Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями, в то время как число 0.25 хранится точно, так как представляет из себя степень двойки.

В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным. "

Похожие вопросы
Что это за знак в информатике "<>" ???Скажите, пожалуйста!!
Вопросы по информатике
как в С++ записать точность ( на выходе) - с 5 знаками после запятой. к примеру в паскале writeln(a:5:0); а в С++ как??
вычисление точности, интерации. программа на си
В задаче о вычислении интеграла с помощью разложения в степенной ряд, вопрос о точности вычисления
какой программой можно выполнить расчеты с точностью до 30 знака после запятой?
Какой ряд самый бысрый для вычисления n знаков после запятой числа Пи?
Как в C++ вывести число с определенной точностью после запятой, сохраняя нули?
"Знаки". Как определяете, , что это именно знак, а не просто так...?
Сколько раз меняет знак ряд? Информатика С++