![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FormatFloat [D6, Win2k]
Plotnick © (2005-11-23 21:15:00)Собственно интересует нет ли функции, которая помогла бы преобразовать дробное число в строку без всяких там добавок вроде экспоненты. А то когда у меня число заходит за рубеж 10+E18, любая дельфовая функция преобразования добавляет этот самый E18, а мне надо без него.
Может кто знает?
Плохиш (2005-11-24 17:42:00) [1]
> Sandman29 © (24.11.05 16:31) [18]
> > У Extended гораздо меньший размер
> > и соответственно ограничение на количество значащих цифр.
> > 2 в 64 степени не вписываются.
Странно, у меня "вписываются"
Sandman29 (2005-11-24 16:31:00) [2]Plotnick (24.11.05 13:32) [15]
> У Extended гораздо меньший размер
> и соответственно ограничение на количество значащих цифр.
> 2 в 64 степени не вписываются.
Plotnick (2005-11-24 13:54:00) [3]Опытным путем выяснил, что
18446744073709551616.892134 = 18446744073709551616
Убираем один разряд, появляется дробная часть:
1844674407370955161.892134 = 1844674407370955161.75
Еще убираем.
184467440737095516.892134 = 184467440737095516.875
Еще
18446744073709551.892134 = 18446744073709551.890625
Короче, не хватает точности вычислений при больших числах.
Plotnick (2005-11-24 13:34:00) [4]Сорри по поводу:
184467440737095516Е19
запятую пропустил. 1,84467440737095516Е19
Plotnick (2005-11-24 13:32:00) [5]
> Если на 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
без дробной части.
Плохиш (2005-11-24 13:07:00) [6]
> Plotnick (24.11.05 12:09) [10]
> Нужен лишь алгоритм перевода в строку.
Мыслим логически.
1. Делим число на 10
2. берём остаток, умножаем на 10, округляем, преобразовываем кцелому, переводим в строку, прибавляем к результату.
3. отбрасываем у числа после деления дробную часть
4 гото 1
PS. Время набития кода 30 сек.
Anatoly Podgoretsky (2005-11-24 12:38:00) [7]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
Anatoly Podgoretsky (2005-11-24 12:30:00) [8]184467440737095516Е19 такое число невозможно представить в Int64, это число близкое к 2^128
Sandman29 (2005-11-24 12:27:00) [9]Plotnick (24.11.05 12:09) [10]
Если на 2 умножить миллион раз, то число во всей компьютерной памяти не поместится. У Extended гораздо меньший размер и соответственно ограничение на количество значащих цифр. 2 в 64 степени не вписываются.
Plotnick (2005-11-24 12:09:00) [10]Несовсем понял насчет собственной математики.
По Вашим словам, получается, что, фактически, Extended не хранит все число, а лишь ту часть, которая показана? А остальное, при надобности добивает нулями?
Но это не так. Я делаю простой пример, набиваю 2 в степени 64, число у меня отображается, как 184467440737095516Е19. То есть, начни я его делить на два 64 раза, я должен был бы не получить исходную величину. На самом деле все в порядке, исходня величина на месте. Значит переменная хранит значение так, как оно есть на самом деле. Поэтому математика собственная не нужна. Нужен лишь алгоритм перевода в строку.
Separator (2005-11-24 11:09:00) [11]Пиши свой класс длинны чисел и свою математику для них, не используй стандартные математические выражения
isasa (2005-11-24 10:55:00) [12]Sandman29 © (24.11.05 10:45) [7]
Вещественные числа Delphi не могут хранить столь длинную мантиссу.
Все вещественные(кроме real48) - стандарт IEEE, и Дельфи здесь ни при чем.
В данном случае
18446744073709551616=1844674407370960000
дополняй нулями.
Sandman29 (2005-11-24 10:45:00) [13]Plotnick (24.11.05 10:10) [5]
Вещественные числа Delphi не могут хранить столь длинную мантиссу.
Plotnick (2005-11-24 10:37:00) [14]В дельфовых функциях используется такой код:
@@1: CMP EAX,18
JLE @@2
MOV EAX,18
@@2: MOV Precision,EAX
То есть, если выставлять точность выше 18, она все равно ее срежет.
Plotnick (2005-11-24 10:10:00) [15]>И что ты хотел бы видеть в младших разрядах чила, если информации о них >нет? Нули? Тогда домножь на 10^n, затем FormatFloat и пририсуй n нулей.
Так нет у меня там нулей. Числа там идут. Есль говорить предметно, то я пишу калькулятор, наподобии виндовского.
Дорустим, есть число 2 в степени 64. Так вот в виндовом калькуляторе оно отображается, как 18446744073709551616, а у меня 1,84467440737096Е19.
Вот, собственно, в чем проблема. Я хочу чтобы число отображалось полностью, а дельфовые функции конвертации не позволяют получить строку с числом, содержащую более 18 символов.
Sandman29 (2005-11-24 09:46:00) [16]Между 100 и 1E2 есть принципиальная разница - в первом случае погрешность не превышает 0.5, во втором - 50. То есть первое число - это представление чисел от 99.5 до 100.5, а второе - от 50 до 150.
Германн (2005-11-24 04:28:00) [17]Как "бывший" физик спрошу. А какой физический смысл может быть у числа представленного более чем 18 значащими разрядами?
Я, лично, значения представленные более чем 5 разрядов, вообще не рассматриваю. Кроме, конечно, констант.
ЮЮ (2005-11-24 04:15:00) [18]>этот самый E18, а мне надо без него
И что ты хотел бы видеть в младших разрядах чила, если информации о них нет? Нули? Тогда домножь на 10^n, затем FormatFloat и пририсуй n нулей.
Германн (2005-11-24 03:32:00) [19]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.
Имхо, я пас.