Другие языки программирования и технологии

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

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

В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным. "
Роман Чернов
Роман Чернов
76 874
эм.... ты же про float говоришь, да?
Потому что мантисса ограничена 53 разрядами. 1/(2^-53) =1,1102230246251565404236316680908e-16
В IEEE 754 double занимает 52 разряда за счет отбрасывания старшей 1,которая всегда равна 1, поэтому в моей формуле выше 53.
▼▼
▼ ▼
35 996