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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2024, 08:45   #1
mlml
 
Регистрация: 04.08.2010
Сообщений: 5
По умолчанию Floating point overflow в 64-bit ОС

Добрый день!

Пишу на Delphi 11 64-bit для Android 64-bit.
Код:
var x: Extended80;
begin
  x:= power(2,-1022);
end;
При выполнении этой команды возникает ошибка:
“Floating point overflow.”

Устраняющая ошибку директива:
Код:
SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
не устраивает, так как при её использовании получается x = 0 (но это не так).

Мне нужно, чтобы это выполнялось без SetExceptionMask (как в 32-битной ОС).
Перерыл русско- и англоязычный интернет, но не нашёл решение.
Как пофиксить?

Последний раз редактировалось mlml; 16.01.2024 в 10:40.
mlml вне форума Ответить с цитированием
Старый 16.01.2024, 15:58   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

А чем-то не устроит указать сразу константу, которую взять хоть из калькулятора ? Зачем это вычислять каждый раз и городить обход исключений.. Если, конечно, это не весь код и там десятки подобных вычислений, тогда можно подумать ещё
phomm на форуме Ответить с цитированием
Старый 16.01.2024, 16:08   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

а функцию power() в исходниках найти и поглядеть, чего там возникает за исключение такое?
я так понимаю, это 2 в степени -1022?? т.е. 1/ (2^1022)? если да, ну, там точно ноль получается с большой точностью...
есть вариант, самому написать функцию возведения в степень и там уже заложить ограничения, чтоб меньше какой-то степени чтоб выдавало чёткий 0 без ошибок.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 16.01.2024 в 16:12.
NetSpace вне форума Ответить с цитированием
Старый 18.01.2024, 03:16   #4
mlml
 
Регистрация: 04.08.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
А чем-то не устроит указать сразу константу, которую взять хоть из калькулятора ? Зачем это вычислять каждый раз и городить обход исключений.. Если, конечно, это не весь код и там десятки подобных вычислений, тогда можно подумать ещё
Конечно же, это только часть вычислений, я просто привёл место, где возникает ошибка. Да и это только частный случай. Например, power(2,1022) выдаёт значение INF (при использовании маски исключений).
В 32-битной ОС:
power(2,-1022) выдаёт 2,2250738585072Е-308
power(2,1022) выдаёт 4,49423283715579Е307
и это меня устраивает, но не то, что выдаёт 64-битная.
Мне нужна большая точность при вычислении:
power(2,i), где i может принимать значения от -1023 до +1023
(Extended80: 19 digits of precision in a range from 3.37E-4932 to 1.18E4932)
И ещё почему-то не открывается docwiki.embarcadero.com
Забанили россиян или проблемы с сайтом?
Но это уже другая тема...

Последний раз редактировалось mlml; 18.01.2024 в 06:01.
mlml вне форума Ответить с цитированием
Старый 18.01.2024, 07:07   #5
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

если возникает такая непреодолимая ошибка, то нет желания часть таких расчётов программно сделать в EXCEL, а уже ответы брать оттуда? заодно создание, чтение и запись в экселевский файл повторите...
или EXCEL у вас тоже такой пример выдаёт с ошибкой?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 18.01.2024 в 10:46.
NetSpace вне форума Ответить с цитированием
Старый 18.01.2024, 08:55   #6
mlml
 
Регистрация: 04.08.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
если возникает такая непреодолимая ошибка, то нет желания часть таких расчётов программно сделать в EXCEL, а уже ответы брать оттуда. заодно создание, чтение и запись в экселевский файл повторите...
или EXCEL у вас тоже такой пример выдаёт с ошибкой?
EXCEL, да, выдаёт результат правильно. Это в Delphi 11 64-bit при работе с типом данных Extended80 почему-то не предусмотрена такая точность.

Последний раз редактировалось mlml; 18.01.2024 в 09:01.
mlml вне форума Ответить с цитированием
Старый 18.01.2024, 15:07   #7
mlml
 
Регистрация: 04.08.2010
Сообщений: 5
По умолчанию

Нашёл, что, если понизить степень, то есть power(2,1022) заменить на:
power(2,100)*power(2,100)*...*power (2,22),
то результат адекватный.
Вопрос, однако, к разработчикам.
mlml вне форума Ответить с цитированием
Старый 20.01.2024, 06:11   #8
mlml
 
Регистрация: 04.08.2010
Сообщений: 5
По умолчанию

Был не прав. Нужно было сделать так:
Код:
const a: Extended80 = 2;
var b, c: Extended80;
begin
  b:= 1022;
  c:= Power(a,b);
end;
и ошибки нет.
mlml вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 Floating Point overflow furgingerbread Помощь студентам 1 21.11.2016 20:06
Метод Камера c++. Матрица 1000х1000. Floating point overflow cripple_nipple Помощь студентам 7 08.04.2015 17:13
floating point overflow в delphi gylayko Помощь студентам 2 14.09.2012 17:34
floating point overflow awzq Общие вопросы C/C++ 2 05.09.2012 13:54
Floating point overflow Ania Lunee Помощь студентам 4 18.05.2012 22:01