Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

Double - колво знаков до запятой и после   Найти похожие ветки 

 
kot666   (2006-07-23 15:53) [0]

Всем привет.
Есть значение которое хранится в Double, нужно узнать сколько знаков до запятой и после.
Всем спасибо.


 
KilkennyCat ©   (2006-07-23 15:55) [1]

Есть свои собственные идеи?


 
kot666   (2006-07-23 16:03) [2]

пока нет:(


 
KilkennyCat ©   (2006-07-23 16:10) [3]

Жаль...
есть как минимум два способа.
например, изобразить число как текст.
FloatToStr
тогда кол-во до запятой и после запятой узнаем при помощи pos


 
kot666   (2006-07-23 16:13) [4]

Хм... не очень красывый, но все же...
А как-то более научнее чтоли есть? :)


 
KilkennyCat ©   (2006-07-23 16:17) [5]

На мой взгляд, вполне красивый... дополню, только, что запятая иногда равна точке...
нестроковый:
Делим на 10 пока не исчезнет дробная часть.
Умножаем на 10 пока не исчезнет целая часть.
Кол-во делений умножений есть искомое.


 
kot666   (2006-07-23 16:18) [6]


> На мой взгляд, вполне красивый... дополню, только, что запятая
> иногда равна точке...

ну да...

> Делим на 10 пока не исчезнет дробная часть.
> Умножаем на 10 пока не исчезнет целая часть.

что значит не исчезнет?


 
kot666   (2006-07-23 16:21) [7]

Arithmetic routines из Math больше мне нравится...


 
KilkennyCat ©   (2006-07-23 16:27) [8]

ну если такие руны знакомы... да еще и нравятся... то может, хотя бы Trunc вспомнится?


 
kot666   (2006-07-23 16:32) [9]

нашел но не вышло.
Взял число 9999999999999999
trunc вернул -1566804069 нормально блин?


 
KilkennyCat ©   (2006-07-23 16:36) [10]

нормально.


 
kot666   (2006-07-23 16:37) [11]

и? Сколько знаков до запятой? 11? а нужно 16.
Может в JCL кто-то юзал? JclMath?


 
KilkennyCat ©   (2006-07-23 16:39) [12]

Вот вам 16.
showmessage(inttostr(trunc(9999999999999999.0)));


 
Юрий Зотов ©   (2006-07-23 16:41) [13]

Нормализованное число с плавающей точкой содержит:

- после запятой столько знаков, сколько позволяет точность типа (для Double это 15-16).

- до запятой столько знаков, чему равна экспонента числа.

Посмотрите FrExp из модуля Math (только надо учесть, что эта функция выдает результаты в двоичной, а не в десятичной системе).


 
KilkennyCat ©   (2006-07-23 16:44) [14]

есть еще научный способ. совсем научный.
К примеру, число из 16 девяток отобразится как 1E16...
Но, поскольку, ход мысли уже переключается на сторонние компоненты, то мне уже делать нечего, придется занятся своей программкой, а то понедельник на носу...


 
kot666   (2006-07-23 16:47) [15]


> Посмотрите FrExp из модуля Math (только надо учесть, что
> эта функция выдает результаты в двоичной, а не в десятичной
> системе).

Юрий! Пожалуйста можно подробнее. Спасибо.


 
Anatoly Podgoretsky ©   (2006-07-23 16:47) [16]

kot666   (23.07.06 16:32) [9]
Такое число именно в таком виде (16 знаков) не может поместиться в double, только приблизительное, а вот куда ты помещаешь результат работы Trunc остается вопросом.


 
kot666   (2006-07-23 16:48) [17]


> Такое число именно в таком виде (16 знаков) не может поместиться
> в double, только приблизительное, а вот куда ты помещаешь
> результат работы Trunc остается вопросом.

LongInt


 
Юрий Зотов ©   (2006-07-23 16:51) [18]

> kot666   (23.07.06 16:47) [15]

Дык.. она же и в справке есть, и в исходниках, да еще и с комментариями. Куда ж еще подробнее-то?


 
kot666   (2006-07-23 16:52) [19]


> Дык.. она же и в справке есть, и в исходниках, да еще и
> с комментариями. Куда ж еще подробнее-то?

Математически :)


 
KilkennyCat ©   (2006-07-23 16:53) [20]

> [18] Юрий Зотов ©   (23.07.06 16:51)

Справка на английском.


 
kot666   (2006-07-23 16:53) [21]


> Такое число именно в таком виде (16 знаков) не может поместиться
> в double, только приблизительное, а вот куда ты помещаешь
> результат работы Trunc остается вопросом.

Попробовал Int64 результат 16. Наверное опка на этом (trunc) остановлюсь.


 
kot666   (2006-07-23 16:54) [22]


> Справка на английском.

у меня на русском :)


 
Anatoly Podgoretsky ©   (2006-07-23 16:56) [23]

kot666   (23.07.06 16:48) [17]
LongInt инт в состянии поместить только 9 знаков.


 
Anatoly Podgoretsky ©   (2006-07-23 16:57) [24]

kot666   (23.07.06 16:53) [21]
16 это неверный ответ, должно получиться 9999999999999999


 
KilkennyCat ©   (2006-07-23 16:59) [25]

> Наверное опка на этом (trunc) остановлюсь


есть еще frac


 
kot666   (2006-07-23 17:00) [26]


> есть еще frac

спасибо. нашел.


 
kot666   (2006-07-23 17:00) [27]


> 16 это неверный ответ, должно получиться 9999999999999999

да. но я уже о своем :)


 
Anatoly Podgoretsky ©   (2006-07-23 17:04) [28]

KilkennyCat ©   (23.07.06 16:59) [25]
Ответ 15 знаков


 
KilkennyCat ©   (2006-07-23 17:06) [29]

> [28] Anatoly Podgoretsky ©   (23.07.06 17:04)

а... кашу маслом не испортить.


 
Юрий Зотов ©   (2006-07-23 17:23) [30]

> kot666   (23.07.06 16:52) [19]

Не считая знака, числа с плавающей точкой в машине хранятся в виде комбинации 2-х полей - вещественной мантиссы M и целой экспоненты E. Оба этих числа хранятся, естественно, в двоичном виде, а величина числа равна M*2^E.

Тип числа (Double, Extended...) определяет размер этих полей - то есть, сколько знаков содержит M и каково максимальное значение E. Эти значения есть в справке (см. Real types).

Нормализованное число - это число, у которого M < 1. Например, нормализованная десятичная форма числа 15 - это 0.15E2 (M=0.15, E=2), а числа 0.015 - это 0.15E-1 (M=0.15, E=-1).

Для любых чисел M содержит всегда одно и то же количество знаков (как уже говорилось, оно определяется только типом числа). Хоть число "круглое", хоть нет - неважно, длина M все равно одна и та же, просто для "круглого" числа M будет содержать незначащие нули.

Отсюда и вытекает то, что я сказал в [13]. Понятие же "сколько знаков после запятой" относится не к самому числу, а к его строковому (визуальному) представлению. Значит, получить его можно только одним способом - перевести нормализованную мантиссу в это самое строковое представление, убрать нули в конце строки, взять длину оставшейся строки и уменьшить ее на 2 (ноль и точка). Ну и учесть знак, если он есть.

А десятичное значение нормализованной экспоненты, ясное дело, дает число знаков до запятой.

Вот простенькая иллюстрация:

procedure TForm1.FormCreate(Sender: TObject);
var
 D: double;
 M: extended;
 E: integer;
begin
 D := 4/3;
 FrExp(D, M, E);
 D := Ldexp(M, E);
 Caption := Format("M = %g, E = %d, D = %g", [M, E, D])
end;

Описание использованных функций есть в справке по Math, а подробности машинной арифметики вещественных чисел можно посмотреть здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
kot666   (2006-07-23 17:26) [31]


> [30] Юрий Зотов ©   (23.07.06 17:23)

Премного благодарен!


 
kot666   (2006-07-23 17:41) [32]

Кстати что посоветуете для операций с данными из БД: ftFloat или ftBCD?


 
kot666   (2006-07-23 17:42) [33]

тип данных: decimal(18,4) в MS SQL


 
Fay ©   (2006-07-23 17:53) [34]

2 kot666   (23.07.06 17:41) [32]
В Delphi BCD плющевый


 
kot666   (2006-07-23 17:54) [35]


> В Delphi BCD плющевый

можно на русском? :)


 
Fay ©   (2006-07-23 17:56) [36]

2 kot666   (23.07.06 17:54) [35]
В Делфи БЦД плюшевый


 
kot666   (2006-07-23 17:58) [37]

что значит ""плющевый"?


 
Fay ©   (2006-07-23 18:07) [38]

2 kot666   (23.07.06 17:58) [37][Ответить]
> что значит ""плющевый"?
плюшевый :
use pubs
create table BCD (
ID int not null identity(1, 1) primary key,
VAL decimal(28, 9) not null
)

insert into BCD (VAL) values (999999999999999.99999999)

Попробуй поработать с такой таблицей


 
Anatoly Podgoretsky ©   (2006-07-23 18:54) [39]

Юрий Зотов ©   (23.07.06 17:23) [30]
Но только не для его числа 9999999999999999, в этом случае в double будет совсем другое число и вывод тоже буде экспотенциальный. Точность то всего 15 знаков



Страницы: 1 вся ветка

Текущий архив: 2006.08.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.041 c
6-1143528314
balepa
2006-03-28 10:45
2006.08.13
Процедура обработки OnClientRead


11-1131392864
Flea
2005-11-07 22:47
2006.08.13
проблема со вкладкой Tabcontrol


15-1152949725
QuickFinder
2006-07-15 11:48
2006.08.13
Программа для редактирования видео


15-1153159217
tesseract
2006-07-17 22:00
2006.08.13
в этот день


1-1151911247
DVM
2006-07-03 11:20
2006.08.13
Форматированная разница между двумя датами