Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизДо какого числа Double точно хранит целые? Найти похожие ветки
← →
Eu (2012-07-25 12:35) [0]То есть, погрешность хранения менее 0.5?
На примере:procedure test(iSrc: int64);
var
iDst: int64;
d: double;
begin
d := iSrc ;
iDst := Round(d);
if iDst = iSrc then ShowMessage("Test complete");
end;
Какое минимальное положительное число можно передать в процедуру Test, чтобы тест собственно не сработал?
Эх забыл я школьную информатику, может кто оперативно ответ сказать? )) Спор тут вышел )
← →
Anatoly Podgoretsky © (2012-07-25 12:55) [1]> Eu (25.07.2012 12:35:00) [0]
Точность определяется значением Precision.
В справке есть значения, но можешь расчитывать на 15 знаков
← →
Куку (2012-07-25 14:00) [2]
> До какого числа Double точно хранит целые?
Согласно календаря Майя, до 23 декабря 2012 года.
Даже если и дольше будет хранить, то это, увы, уже никому не понадобится.
← →
Eu (2012-07-25 14:20) [3]
> Точность определяется значением Precision.
что такое Precision?
> В справке есть значения, но можешь расчитывать на 15 знаков
не нашел никакого значения...
То есть, при сведении дробной части к нулю, в целой части может точно хранится 15 знаков? Иными словами:
999`999`999`999`999,0 ?
← →
Pavia © (2012-07-25 14:25) [4]Between 252=4,503,599,627,370,496 and 253=9,007,199,254,740,992 the representable numbers are exactly the integers. For the next range, from 253 to 254, everything is multiplied by 2, so the representable numbers are the even ones, etc. Conversely, for the previous range from 251 to 252, the spacing is 0.5, etc.
http://en.wikipedia.org/wiki/Double-precision_floating-point_format
← →
Inovet © (2012-07-25 14:57) [5]> [3] Eu (25.07.12 14:20)
> То есть, при сведении дробной части к нулю, в целой части
> может точно хранится 15 знаков?
Ты прочитай про формат чисел с плавающей точкой.
← →
Sha © (2012-07-25 15:00) [6]
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: int64;
d: double;
begin;
i:=9007199254740980;
repeat;
j:=i+1;
d:=j;
i:=trunc(d);
Memo1.Lines.Add(IntToStr(i));
until i<>j; //9007199254740992 = 2^53
end;
← →
Компромисс © (2012-07-25 15:02) [7]
> i:=9007199254740980;
Автора такого кода очевидно уже известен ответ. По-честному надо, инициализируя нулем :)
← →
Anatoly Podgoretsky © (2012-07-25 15:02) [8]
> не нашел никакого значения...
У тебя неправильная справка, в правильной тема Real types
← →
Eu (2012-07-25 16:33) [9]
> procedure TForm1.Button1Click(Sender: TObject);
спасибо!
Остается доказать, что нету чисел менее 9007199254740980 для которых условие не соблюдается )) (я про положительные).
Я что-то помню про машинное эпсилон... По идее, чем больше число - тем больше погрешность абсолютная... В общем, уверен, что это правильный ответ...
Но точно также уверен, что это число можно посчитать по формуле )
← →
Давайте будем жрать! (2012-07-25 16:57) [10]
> уверен, что это число можно посчитать по формуле
осспади... заглянув на http://ru.wikipedia.org/wiki/Число_двойной_точности видим, что под мантиссу отведено 52 бита. следовательно, максимальное число, которое там может храниться, = 2^53 - 1. что и подтверждает пример, в котором на 2^53 начинаются расхождения.
← →
Sha © (2012-07-25 19:25) [11]чуть точнее так:
1) под мантиссу отведено 52 бита, следовательно макс. число в мантиссе (2^52)-1,
2) с учетом бита в уме макс. представимое число (2^53)-1,
3) число 2^53 будет последним целым в серии без пропусков,
т.к. оканчивается нулевым битом, отбрасывание которого не влияет на результат.
← →
Давайте будем жрать! (2012-07-25 20:31) [12]
> Sha © (25.07.12 19:25) [11]
Мда, поправил дурня. Действительно, 2^53-1 — это особенность реализации, а максимальное число в 52-битной мантиссе 2^52-1. Весь день какую-то хрень несу…
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c