Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.167 c
11-1113674934
Dot
2005-04-16 22:08
2005.12.11
VCL, KOLForm &amp; uses mirror


14-1131663499
chainik86
2005-11-11 01:58
2005.12.11
Где можно взять бесплатный GLScene?


4-1129090176
Smertb
2005-10-12 08:09
2005.12.11
hook


14-1132521210
Fl@sh
2005-11-21 00:13
2005.12.11
Выбор видеокарты


4-1129201201
Виталий11111
2005-10-13 15:00
2005.12.11
Перехват сообщений от мыши