Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.

Имхо, я пас.


Наверх

Титульная страница Поиск, карта сайта Написать письмо