Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
3-1130428514
Apachi
2005-10-27 19:55
2005.12.11
Доступ к данным через интернет ISAPI


2-1132342808
SerGe@nt
2005-11-18 22:40
2005.12.11
Можно ли скопировать несколко файлов?


1-1132010992
Dark Lord
2005-11-15 02:29
2005.12.11
Форма в dll


2-1132400297
Volfram
2005-11-19 14:38
2005.12.11
Проблема с MediaPlayer


2-1132964759
KGC
2005-11-26 03:25
2005.12.11
Отправка письма с аттачем с помощью WinSock





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский