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

Вниз

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

Наверх





Память: 0.54 MB
Время: 0.129 c
2-1153833875
Homo Sapiens
2006-07-25 17:24
2006.08.13
Проблема с реестром


3-1149353489
eJack
2006-06-03 20:51
2006.08.13
Как добавить пользователя в базу


15-1153405319
Nic
2006-07-20 18:21
2006.08.13
Наверное глупый вопрос


15-1152882155
Ketmar
2006-07-14 17:02
2006.08.13
RSDN требует MS Word для статей


3-1149323064
АНОНИМ
2006-06-03 12:24
2006.08.13
Закрыть базу Access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский