Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизFormatFloat Найти похожие ветки
← →
Plotnick (2005-11-23 21:15) [0]Собственно интересует нет ли функции, которая помогла бы преобразовать дробное число в строку без всяких там добавок вроде экспоненты. А то когда у меня число заходит за рубеж 10+E18, любая дельфовая функция преобразования добавляет этот самый E18, а мне надо без него.
Может кто знает?
← →
Германн © (2005-11-24 03:32) [1]The Precision parameter specifies the precision of the given value. It should be 7 or less for values of type Single, 15 or less for values of type Double, and 18 or less for values of type Extended.
Имхо, я пас.
← →
ЮЮ © (2005-11-24 04:15) [2]>этот самый E18, а мне надо без него
И что ты хотел бы видеть в младших разрядах чила, если информации о них нет? Нули? Тогда домножь на 10^n, затем FormatFloat и пририсуй n нулей.
← →
Германн © (2005-11-24 04:28) [3]Как "бывший" физик спрошу. А какой физический смысл может быть у числа представленного более чем 18 значащими разрядами?
Я, лично, значения представленные более чем 5 разрядов, вообще не рассматриваю. Кроме, конечно, констант.
← →
Sandman29 © (2005-11-24 09:46) [4]Между 100 и 1E2 есть принципиальная разница - в первом случае погрешность не превышает 0.5, во втором - 50. То есть первое число - это представление чисел от 99.5 до 100.5, а второе - от 50 до 150.
← →
Plotnick (2005-11-24 10:10) [5]>И что ты хотел бы видеть в младших разрядах чила, если информации о них >нет? Нули? Тогда домножь на 10^n, затем FormatFloat и пририсуй n нулей.
Так нет у меня там нулей. Числа там идут. Есль говорить предметно, то я пишу калькулятор, наподобии виндовского.
Дорустим, есть число 2 в степени 64. Так вот в виндовом калькуляторе оно отображается, как 18446744073709551616, а у меня 1,84467440737096Е19.
Вот, собственно, в чем проблема. Я хочу чтобы число отображалось полностью, а дельфовые функции конвертации не позволяют получить строку с числом, содержащую более 18 символов.
← →
Plotnick (2005-11-24 10:37) [6]В дельфовых функциях используется такой код:
@@1: CMP EAX,18
JLE @@2
MOV EAX,18
@@2: MOV Precision,EAX
То есть, если выставлять точность выше 18, она все равно ее срежет.
← →
Sandman29 © (2005-11-24 10:45) [7]Plotnick (24.11.05 10:10) [5]
Вещественные числа Delphi не могут хранить столь длинную мантиссу.
← →
isasa © (2005-11-24 10:55) [8]Sandman29 © (24.11.05 10:45) [7]
Вещественные числа Delphi не могут хранить столь длинную мантиссу.
Все вещественные(кроме real48) - стандарт IEEE, и Дельфи здесь ни при чем.
В данном случае
18446744073709551616=1844674407370960000
дополняй нулями.
← →
Separator © (2005-11-24 11:09) [9]Пиши свой класс длинны чисел и свою математику для них, не используй стандартные математические выражения
← →
Plotnick (2005-11-24 12:09) [10]Несовсем понял насчет собственной математики.
По Вашим словам, получается, что, фактически, Extended не хранит все число, а лишь ту часть, которая показана? А остальное, при надобности добивает нулями?
Но это не так. Я делаю простой пример, набиваю 2 в степени 64, число у меня отображается, как 184467440737095516Е19. То есть, начни я его делить на два 64 раза, я должен был бы не получить исходную величину. На самом деле все в порядке, исходня величина на месте. Значит переменная хранит значение так, как оно есть на самом деле. Поэтому математика собственная не нужна. Нужен лишь алгоритм перевода в строку.
← →
Sandman29 © (2005-11-24 12:27) [11]Plotnick (24.11.05 12:09) [10]
Если на 2 умножить миллион раз, то число во всей компьютерной памяти не поместится. У Extended гораздо меньший размер и соответственно ограничение на количество значащих цифр. 2 в 64 степени не вписываются.
← →
Anatoly Podgoretsky © (2005-11-24 12:30) [12]184467440737095516Е19 такое число невозможно представить в Int64, это число близкое к 2^128
← →
Anatoly Podgoretsky © (2005-11-24 12:38) [13]Extended 3.6 x 10^–4951 .. 1.1 x 10^4932 19–20
1. 19 для положительных чисел.
2. 2^63 = 18 446 744 073 709 551 616
3. Кода от автора пока не видать
4. Виндоуский калькулятор работает с 128 битными числами.
Очень интересует пункт 3
← →
Плохиш © (2005-11-24 13:07) [14]
> Plotnick (24.11.05 12:09) [10]
> Нужен лишь алгоритм перевода в строку.
Мыслим логически.
1. Делим число на 10
2. берём остаток, умножаем на 10, округляем, преобразовываем кцелому, переводим в строку, прибавляем к результату.
3. отбрасываем у числа после деления дробную часть
4 гото 1
PS. Время набития кода 30 сек.
← →
Plotnick (2005-11-24 13:32) [15]
> Если на 2 умножить миллион раз, то число во всей компьютерной
> памяти не поместится. У Extended гораздо меньший размер
> и соответственно ограничение на количество значащих цифр.
> 2 в 64 степени не вписываются.
Чего-чего не вписывается? 1.1 x 10^4932 - мне кажется, что это значительно больше чем 2 в 64.
> 184467440737095516Е19 такое число невозможно представить
> в Int64, это число близкое к 2^128
В Dword64 возможно. Знаю, знаю - в дельфи такой тип не поддерживается. Но мне приходится как-то поддерживать.
> 3. Кода от автора пока не видать
Какого кода? Две кнопки - в одной X := X*2; В другой X := X/2. Код :)))
Вроде, как-то написал, но возникла проблема с функцией Int.
var
F1,F2: Extended;
Res: Extended;
IntRes: Integer;
Dig: String;
Pres: String;
InsertTo: Integer;
begin
F1 := F;
F2 := F;
if F1 < 0 then begin
Dig := "-";
InsertTo := 2;
F1 := F1*-1;
F2 := F2*-1;
end else begin
Dig := "";
InsertTo := 1;
end;
while F1 > 10 do begin
F1 := Int(F1/10)*10;
Res := F2 - F1;
IntRes := Round(Int(Res));
Insert(IntToStr(IntRes),Dig,InsertTo);
F1 := F1/10;
F2 := F1;
end;
IntRes := Round(Int(F1));
Insert(IntToStr(IntRes),Dig,InsertTo);
F1 := F - Int(F);
Pres := FormatFloat(".##########",F1);
Result := Dig + Pres;
Целую часть я преобразую сам. А для дробной решил воспользоваться конструкцией:
F1 := F - Int(F);
Pres := FormatFloat(".##########",F1);
Десяти знаков после запятой мне хватает. Но вот беда - для числа вида:
18446744073709551616.892134
конструкция F1 := F - Int(F); возвращает нуль. И число в итоге превращается в:
18446744073709551616
без дробной части.
← →
Plotnick (2005-11-24 13:34) [16]Сорри по поводу:
184467440737095516Е19
запятую пропустил. 1,84467440737095516Е19
← →
Plotnick (2005-11-24 13:54) [17]Опытным путем выяснил, что
18446744073709551616.892134 = 18446744073709551616
Убираем один разряд, появляется дробная часть:
1844674407370955161.892134 = 1844674407370955161.75
Еще убираем.
184467440737095516.892134 = 184467440737095516.875
Еще
18446744073709551.892134 = 18446744073709551.890625
Короче, не хватает точности вычислений при больших числах.
← →
Sandman29 © (2005-11-24 16:31) [18]Plotnick (24.11.05 13:32) [15]
> У Extended гораздо меньший размер
> и соответственно ограничение на количество значащих цифр.
> 2 в 64 степени не вписываются.
← →
Плохиш © (2005-11-24 17:42) [19]
> Sandman29 © (24.11.05 16:31) [18]
> > У Extended гораздо меньший размер
> > и соответственно ограничение на количество значащих цифр.
> > 2 в 64 степени не вписываются.
Странно, у меня "вписываются"
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.049 c