FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 08:26Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Неточности дробных чисел
Неточности дробных чисел
sashasoldДата: Понедельник, 07.10.2019, 03:07 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 41
Репутация: 0
Статус: Offline
Начал изучать FB, и вот что заметил:
Вопрос парадокс ЭВМ не может правильно вычислять?
как это побороть, и собственно из-за чего это, толком не нашел ответа, где то упоминалось из-за перекодировки чисел степени двойки через которое рассчитывает ЦП

Dim As Single a, b
Dim As Double c, d
Dim As Long i

Print 0.7+0.1
a=0.7
b=0.1
Print a+b
c=0.7
d=0.1
Print a+b
Print
a=0
For i=1 To 10
a+=b
Print a
Next

Print Frac(123.7)
Sleep
Прикрепления: 2033986.png (1.8 Kb)
 
DarkDemonДата: Понедельник, 07.10.2019, 07:45 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 188
Репутация: -2
Статус: Offline
Это из-за вещественного формата числа. Данные в котором располагаются нелинейно.
https://en.wikipedia.org/wiki/Single-precision_floating-point_format

Цитата sashasold ()
как это побороть


Никак, правильно определять границы точности для своей программы и выбирать соотв. форматы чисел.
Хватает SINGLE - бери SINGLE, не хватает - тогда DOUBLE. Нужна линейная сетка - тогда только
целочисленные операции. SINGLE - обеспечивает точность примерно в 7 знаков(суммарно),
DOUBLE: 15-17.
Не хватает разрядов - тогда нужна длинная арифметика, она медленная и затратная по ЦП.

Ещё можно использовать трюки, например оперировать с целочисленным форматом, считая его вещественным,
при выводе на печать - переводить в вещественный. Операции сложения и вычитания при этом не изменятся,
умножение и деление можно производить в вещественных числах.


Сообщение отредактировал DarkDemon - Понедельник, 07.10.2019, 07:50
 
sashasoldДата: Вторник, 08.10.2019, 02:00 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 41
Репутация: 0
Статус: Offline
"Никак" - весело, не думал что скоро упрусь в ограничения компилятора (хотя как я понял это на всех языка так?)
Точности то и Single хватает за глаза. Тут вопрос в другом - почему так, и раз так, как с этим работают программисты - в примерах справки ни где не встречал костылей по работе с дробными числами.

И вот собственно из -за чего заметил, не срабатывало подобное условие:
Dim As Single a, b
Dim As Double c, d
Dim As Long i

a=0.7
b=0.1
If b=0.1 Then
Print "выполняю код"
EndIf
c=0
d=0.1
For i=1 To 10
c+=d
If c=0.8 Then
Print "***c=0.8***"
Print "выполняю код"
EndIf
Print c
Next

Sleep

Так что ли делать?
И как опытные программисты делают - только переводом в целочисленный формат?
'---
c=0
d=0.1
For i=1 To 10
c+=d
If c>0.795 And c<0.805 Then
Print "***c=0.8***"
Print "выполняю код"
EndIf
Print c
Next

Sleep

*32 битный компилятор


Сообщение отредактировал sashasold - Вторник, 08.10.2019, 02:21
 
DarkDemonДата: Вторник, 08.10.2019, 09:52 | Сообщение # 4
Полковник
Группа: Друзья
Сообщений: 188
Репутация: -2
Статус: Offline
Цитата sashasold ()
И как опытные программисты делают


Вариантов много, можно перевести в целочисл. формат чисто для проверки.
Можно использовать изначально целочисленный(подразумевая, что в реале он меньше на несколько порядков).
А можно просто не использовать такие алгоритмы, где нужно проверять точно. Т.е либо вести контроль границ,
либо ставить одностороннее условие - что обычно и делают грамотные программисты.
 
Форум » Freebasic » Вопросы по языку FreeBasic » Неточности дробных чисел
  • Страница 1 из 1
  • 1
Поиск: