Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2008, 14:52   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Преобразование числа с плавающей точкой в строку

Код
Код:
var
  e: Extended;
begin
  e := 2.9514790517935282584E20;
  ShowMessage (FormatFloat ('#.########################E+0', e) + #13 +
               FloatToStr (e) + #13 +
               FloatToStrF (e, ffGeneral, 100, 1));
end;
Результат
Сообщение следующего содержания:
Цитата:
2.95147905179352826E+20
2.95147905179353E20
2.95147905179352826E20
Ни один из вариантов не верный - это факт. Вот и возник у меня вопрос, как проще получить точное значение числа с плавающей точкой типа Extended. В нэте не нашёл. Пробовал сам разобратся. Вроде можно разобрать значение по байтам и самому по формуле, что-то типа:



в виде строки построить число. Но это гемор еще тот. Если у кого готовое что есть, может выложите здесь. А мож у кого мысли есть по умнее моих. Тож сюда выкладывайте.

Заранее благодарю
Sibedir вне форума Ответить с цитированием
Старый 07.03.2008, 15:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ни один из вариантов не верный - это факт.
Эт еще почему?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.03.2008, 15:57   #3
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Sibedir, уточняйте. Вас ист дас "точное значение числа с плавающей точкой"? У вещественных в машинном представлении не может быть точных значений по определению.
B_N вне форума Ответить с цитированием
Старый 08.03.2008, 19:26   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Эт еще почему?
e: Extende = 2.9514790517935282584E20 = 0x4042FFFFFFFFFFFFFFFF
а
e: Extende = 2.95147905179352826E20 = 0x40438000000000000004
Цитата:
У вещественных в машинном представлении не может быть точных значений по определению
Эт еще почему?
Как раз в машинном представлении любое число ограниченно конечным набором цифр (бит). Или это не так?

Но если честно, мне это уже не так важно. Я всетаки решил использовать тип Int64. Мне не понравился способ представления вещественного числа в памяти (см. пост #1). Он многое теряет в точности. Ведь не смотря на то, что есть такое вещественное число как 2.9514790517935282584E20 (аж 19 знаков после запятой), а вот такого числа как 2.951...583E20 уже нет. Тут вообще с точностью полная неразбериха. Не удевительно, что функции представления числа с плавающей точкой как строки не показывают цифры далше чем 17-ая после запятой. Это просто не имело бы смысла.
Sibedir вне форума Ответить с цитированием
Старый 08.03.2008, 19:33   #5
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Посмотрите эту статью http://www.delphikingdom.com/asp/vie...?catalogid=374
_Dmitry вне форума Ответить с цитированием
Старый 08.03.2008, 20:04   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Спасибо, _Dmitry. Об этом действительно не пиcали в тех книгах, которые я читал. Многое, конечно, и так было понятно, но это уже с высоты нескольких лет программирования. А хотелось бы это знать уже с универа.
В общем, спасибо за пояснение.
Sibedir вне форума Ответить с цитированием
Старый 08.03.2008, 20:07   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
e: Extende = 2.9514790517935282584E20 = 0x4042FFFFFFFFFFFFFFFF
а
e: Extende = 2.95147905179352826E20 = 0x40438000000000000004

Эт еще почему?
Как раз в машинном представлении любое число ограниченно конечным набором цифр (бит). Или это не так?

Но если честно, мне это уже не так важно. Я всетаки решил использовать тип Int64. Мне не понравился способ представления вещественного числа в памяти (см. пост #1). Он многое теряет в точности. Ведь не смотря на то, что есть такое вещественное число как 2.9514790517935282584E20 (аж 19 знаков после запятой), а вот такого числа как 2.951...583E20 уже нет. Тут вообще с точностью полная неразбериха. Не удевительно, что функции представления числа с плавающей точкой как строки не показывают цифры далше чем 17-ая после запятой. Это просто не имело бы смысла.
Sibedir, я Вас не понимаю. Вы продолжаете задавать какие-то странные вопросы.... Ну если у десятибайтных вещественных под мантиссу отводится 64 бита, умножаем на log10(2), получаем примерно 19 - 19 значащих цифр, всё, край! Какая "точность" в десятичной записи может быть вообще у иррациональных чисел??? И даже у большинства рациональных??? Я не понимаю, как вообще можно раздумывать над выбором в пользу вещественных и целых, если в машинном виде это абсолютно разные вещи... Если бы Вы хотя бы объяснили, что ищете... Вам нужны длинные целые? Вам нужна плавающая точка с огромной точностью? Полно на свете таких библиотек. Не знаю, как в плане паскаля, но для С или фортрана есть библиотеки, которые поддерживают сотни миллионов и миллиарды значащих цифр...
B_N вне форума Ответить с цитированием
Старый 08.03.2008, 20:22   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да не, B_N, мне милиарды не нужны. Мне хватит и трех знаков после запятой. Для меня главное знать точное значение числа. И такие приколы, как
0.1 = 0x3ffbcccccccccccccccd = 0x3ffbcccccccccccccd00
мне не нужны.

А если вам интересно, что это я такое делаю и для чего мне это все нужно, то тут вообщето секретов нет. Я пишу CAD-систему, а тип я выбираю для хранения координат. Кстати, я так понял, что в большенстве CAD-систем координаты хранятся тоже в виде целых чисел, а уже для вывода на экран используется деление на 10^x.

Последний раз редактировалось Sibedir; 08.03.2008 в 20:26.
Sibedir вне форума Ответить с цитированием
Старый 08.03.2008, 20:39   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Кстати, я так понял, что в большенстве CAD-систем координаты хранятся тоже в виде целых чисел, а уже для вывода на экран используется деление на 10^x.
Вещественные числа в машинном виде тоже хранятся в "целом" виде в любом калькуляторе, что здесь такого? А серьезные инженерные и, тем более, научные системы просто хранят "самодельные", не поддерживаемые центральным проессором, сопроцессором, числа с большей точностью, смотря какая задача. Я почему Вам и советую, найдите какую-нибудь приличную библиотеку для больших чисел да и всё. А точность int64 АБСОЛЮТНО ТАКАЯ ЖЕ, как у типа extended - 64 бита или 20 значащих знаков, только у extended еще и экспонента есть до 4-х с лишним тысяч порядков, которую Вы при такм раскладе будете вынуждены хранить отдельно.
B_N вне форума Ответить с цитированием
Старый 09.03.2008, 19:22   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Я почему Вам и советую, найдите какую-нибудь приличную библиотеку для больших чисел да и всё
Не, мне большие числа не нужны. Int64 хватит. Ну сами посудите. MaxInt64 = 9223372036854775807. Если считать каждую единицу за 1/1000000 мм (этого более чем достаточно), то максимальное расстояние, которым мы можем оперировать используя Int64, измеряется почти 10000000 км.
Цитата:
А точность int64 АБСОЛЮТНО ТАКАЯ ЖЕ, как у типа extended - 64 бита или 20 значащих знаков, только у extended еще и экспонента есть до 4-х с лишним тысяч порядков, которую Вы при такм раскладе будете вынуждены хранить отдельно.
При таком раскладе она мне не нужна. К тому же при определенных операциях при использовании extended мы рискуем потерять точность. Так что Int64 подходит куда лучше чем все остальное. К тому же я предполагаю, что использование библиотек наложит свой отпечаток на скорость расчетов. А их будет производится порой очень много.

Последний раз редактировалось Sibedir; 09.03.2008 в 19:24.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сложить два числа с плавающей точкой forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 29.03.2010 02:15
Преобразование числа в строку )Игнат( Общие вопросы Delphi 6 06.07.2008 09:32
Сравнение чисел с плавающей точкой ? Ulex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 12.04.2008 21:14
Числа с плавающей точкой Blondinka Общие вопросы Delphi 8 21.09.2007 11:32