![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| dzen Tiur |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 26.1.2007 Репутация: нет Всего: нет |
Есть переменная типа Double, она получается из внешнего источника.
Как известно из математики любое число можно записать в периодической форме. Например: 2 = 1.(9), 0.5 = 0.4(9) и т.п. при помощи девятки в периоде. Внешний источник выдает и в том и в другом виде в зависимости от фазы луны наверно... Нужно всё привести к одной форме - обычной, без девятки в периоде. Тут возникла такая мысль - если определить что эта девятка в периоде есть, то можно просто округлить до последнего осмысленного разряда, но для этого необходимо уметь вынуть из double мантиссу и логарифм, а потом ещё в мантиссе уметь посчитать количество значящих разрядов(что в принципе не так уж сложно). Получается, что нужно уметь выделить мантиссу и логарифм, да и сам метод не то, чтоб уж очень правильный. Вобщем помоги мне общественный разум |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Просто округлить предпоследний разряд, но не факт что это поможет. Не все числа представимые без периода в 10чной системе счисления представимы без периода в двоичной.
Это сообщение отредактировал(а) Alexeis - 3.7.2007, 14:58 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
dzen Tiur,
А если у тебя период будешь 1.1231(3) то куда округлять? -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| JanMihail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 31.5.2007 Где: Астана Репутация: нет Всего: нет |
Я бы сделал так.
1. Нашел 9 в периоде 2. Удалил все девятки. 3. Последнее число увеличил на 1 Например: 1. 4,04799999999999999999999 2. 4,047 3. 4,048 Или округлять пока останется число без периода |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
JanMihail,
1. А если последняя восмеркой? Ни кто тебе не гарантирут что период будет всегда правильным. 2. А если период будет такой 1.49(89)? Добавлено через 2 минуты и 23 секунды Правильниее будет взять какое-то допустимое для конкретной задачи кол-во знаков мантисы, и округлять до него. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| JanMihail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 31.5.2007 Где: Астана Репутация: нет Всего: нет |
ну сабж же говорит что в периоде 9, поэтому мое решение такое |
|||
|
||||
| dzen Tiur |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 26.1.2007 Репутация: нет Всего: нет |
2 Alexeis
Вы подали интересный мысль. Насколько я понимаю в случае округления последнего разряда мантиссы в большую сторону старший разряд будет увеличен на единицу, а поскольку он девятка, то произойдет перенос и так по цепочке число приведется к непериодическому виду. 0.999999999999999, округление до 13 разряда (для double) получится 0.99999999999990 + 0.0000000000001 // в результате округления в большую сторону = 1 Таким образом задача приведения числа к непериодическому виду, если оно изначально непериодическое(т. е. в периоде девятка) сводится к округлению самого младшего разряда мантиссы, что довольно просто делается SimpleRoundTo в сочетании с Log10. Сделал так - пока работает корректно. Насчет двоичных трудностей это надо подумать. 2 Rennigth Это я не знаю, ибо моя проблема только с девяткой в периоде. Изначально значения непериодические, но внешняя софтина пользуясь математическими изощрениями представляет числа как периодические с девяткой в периоде. 2 JanMihail Тут всё дело в том, что придется работать со строками, а в этом случае возникает большая проблема с расположением запятой. В частности если число очень большое, то там нули надо будет убирать, а с типом Extended там могут быть не нули... Это сообщение отредактировал(а) dzen Tiur - 4.7.2007, 09:27 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |