Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Ахтунг!!! Дробные числа! Есть баг...
toizyДата: Понедельник, 18 Февраля 2008, 15:53 | Сообщение # 1
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Значит, есть код:
Code
**FractPart сейчас станет 0.36:
FractPart = 45.36 - INT(45.36)
**xPart = 0.36 * 100 = 36
xPart=FractPart*100
**yPart = 36, но ни хрена! yPart = 35!!!
yPart=INT(xPart)
Message("","xPart")
Message("","yPart")

Косяк! А вот так - всё путём:

Code
FractPart = 0.36
**xPart = 0.36 * 100 = 36
xPart=FractPart*100
**yPart = 36, как и ожидалось
yPart=INT(xPart)
Message("","xPart")
Message("","yPart")

Выходит, ошибка происходит в строке FractPart = 45.36 - INT(45.36)! Как бороться?


Жизнь оказалась не такой уж и забавной, как поначалу...
 
Alex3AДата: Понедельник, 18 Февраля 2008, 23:45 | Сообщение # 2
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
**FractPart сейчас станет 0.36:
FractPart = 45.36 - INT(45.36)
**xPart = 0.36 * 100 = 36
xPart=FractPart*100
**yPart = 36, но ни хрена! yPart = 35!!!

**xPart=xPart+0.0000000000001 =36
**xPart=xPart+0.00000000000001 = 35

yPart=INT(xPart)
Message("","xPart")
Message("","yPart")

В данном случае, что то косит функция INT(, или видимо xPart вовсе не 36, ошибки округления связанные с максисальным представлением числа,
(к примеру 35.9999999999999999999999999)
на разных машинах могут быть разные, в зависимости от разрядности регистров.
FractPart имеет тип с плавающей запятой, а 36 только его визуальное представление, действительное его значение на
какой то децил меньше, вот INT его и хавает.
Вот если преобразовать xPart в строку и обратно, обрежутся все невидимые знаки, получим истинное целое число (integer).
Переменные в билдере имеют тип почти variant, так что пока ей не задали тип явно, действителен предидущий.
Переменной с плавающей запятой можно присвоить целое число, но от этого она не поменяет свой тип,
Если переменной билдера integer присвоить значение с плавающей запятой она поменяет свой тип.

Quote
Выходит, ошибка происходит в строке FractPart = 45.36 - INT(45.36)! Как бороться?

В строке yPart=INT(xPart).

Сообщение отредактировал Alex3A - Понедельник, 18 Февраля 2008, 23:57
 
toizyДата: Вторник, 19 Февраля 2008, 08:26 | Сообщение # 3
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Да вот и я так понял, что из-за длинного дробного. Жаль, нет явных типов вроде real, integer...
Quote (Alex3A)
Вот если преобразовать xPart в строку и обратно, обрежутся все невидимые знаки, получим истинное целое число (integer).

Так и сделал уже, но только некрасиво это...

Спасибо, Алекс. Хоть кто-то в теме.


Жизнь оказалась не такой уж и забавной, как поначалу...
 
  • Страница 1 из 1
  • 1
Поиск: