Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> девятка в периоде у чисел с плавающей запятой 
V
    Опции темы
dzen Tiur
Дата 3.7.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Есть переменная типа Double, она получается из внешнего источника.
Как известно из математики любое число можно записать в периодической форме.
Например: 2 = 1.(9), 0.5 = 0.4(9) и т.п. при помощи девятки в периоде.
Внешний источник выдает и в том и в другом виде в зависимости от фазы луны наверно...
Нужно всё привести к одной форме - обычной, без девятки в периоде.

Тут возникла такая мысль - если определить что эта девятка в периоде есть, то можно просто округлить до последнего осмысленного разряда, но для этого необходимо уметь вынуть из double мантиссу и логарифм, а потом ещё в мантиссе уметь посчитать количество значящих разрядов(что в принципе не так уж сложно). Получается, что нужно уметь выделить мантиссу и логарифм, да и сам метод не то, чтоб уж очень правильный.

Вобщем помоги мне общественный разум  smile .


PM MAIL   Вверх
Alexeis
Дата 3.7.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Просто округлить предпоследний разряд, но не факт что это поможет. Не все числа представимые без периода в 10чной системе счисления представимы без периода в двоичной.

Это сообщение отредактировал(а) Alexeis - 3.7.2007, 14:58


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 3.7.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



dzen Tiur, 
А если у тебя период будешь 1.1231(3) то куда округлять? 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
JanMihail
Дата 3.7.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 31.5.2007
Где: Астана

Репутация: нет
Всего: нет



Я бы сделал так.
1. Нашел 9 в периоде
2. Удалил все девятки.
3. Последнее число увеличил на 1
Например:
1.  4,04799999999999999999999
2.  4,047
3.  4,048


Или округлять пока останется число без периода
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 3.7.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



JanMihail, 
1. А если последняя восмеркой? Ни кто тебе не гарантирут что период будет всегда правильным.
2. А если период будет такой 1.49(89)?

Добавлено через 2 минуты и 23 секунды
Правильниее будет взять какое-то допустимое для конкретной задачи кол-во знаков мантисы, и округлять до него.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
JanMihail
Дата 3.7.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 31.5.2007
Где: Астана

Репутация: нет
Всего: нет



Цитата

1. А если последняя восмеркой? Ни кто тебе не гарантирут что период будет всегда правильным.
2. А если период будет такой 1.49(89)?

ну сабж же говорит что в периоде 9, поэтому мое решение такое
PM MAIL WWW ICQ   Вверх
dzen Tiur
Дата 4.7.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.