|
FAQ Туториалы и часто задаваемые вопросы |
13.01.2009, 16:05
|
#16
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Ответ: Математика в Blitz3D
по-моему все это обходят вычитанием и сравнением с требуемым уровнем точности
if x1:float - x2:float < 0.00000001 then equals.
|
(Offline)
|
|
13.01.2009, 16:08
|
#17
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Математика в Blitz3D
if x1:float - x2:float < 0.00000001 then equals.
|
if fABS(x1:float - x2:float) < 0.00000001 then equals.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
13.01.2009, 16:39
|
#18
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: Математика в Blitz3D
Да
А говорить, что "не сравнивайте числа с плавающей запятой" - это жестоко.
|
(Offline)
|
|
13.01.2009, 17:39
|
#19
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Сообщение от JohnK
Да
А говорить, что "не сравнивайте числа с плавающей запятой" - это жестоко.
|
Почитай посты повнимательнее, "не сравнивайте на равенство числа с плавающей запятой". Другими словами не юзаем оператор "равно", остальные юзать можно и нужно.
Сообщение от dimanche13
по-моему все это обходят вычитанием и сравнением с требуемым уровнем точности
if x1:float - x2:float < 0.00000001 then equals.
|
К сожалению это может несработать, т.к. точность float 7 знаков, а не 8 или 9 как у вас... К тому же в зависимости от числа символов целой части дробная часть может сжиматься вплоть до 0 знаков
Иначе говоря на равенство сравнивать float нельзя никаким способом. Т.к. любой описанный вами способ с разной степенью вероятности будет врать.
__________________
|
(Offline)
|
|
28.01.2013, 13:49
|
#20
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Математика в Blitz3D
Зарождая новый срач возвращаясь к проблеме. Да: float - тот ещё подарочек. Но Blitz, к прочему, выводит его в потоки (в файл или на экран) обрезано. Выполним вот такой вот код:
Local x#=14.143+0.000001
DebugLog "In Blitz3D my float printed as "+Str(x)
For L=1 To 20
DebugLog GetMyFloat(x,L)
Next
WaitKey()
End
И в лог отладчика мы получим следующее:
In Blitz3D my float printed as 14.143
|
Ну это-то ожидаемо. Флоат же - ерунда.
На самом деле: и флоата хватает и блитц всё посчитал правильно - далее в логе читаем:
14.1
14.14
14.143
14.1430
14.14300
14.143001
14.1430006
14.14300060
14.143000603
14.1430006027
14.14300060272
14.143000602722
14.1430006027222
14.14300060272217
14.143000602722168
14.1430006027221680
14.14300060272216797
14.143000602722167969
14.1430006027221679688
14.14300060272216796875
|
Спасибо, Марк, за фиксированную низкую точность вывода! А это значит, что float(str(x)) - непоправимая потеря точности.
Арифметические результаты не отличаются от аналогичных в MinGW (включая мусор на младших разрядах при излишней точности).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
28.01.2013, 13:57
|
#21
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Математика в Blitz3D
Ах - забыл уточнить: GetMyFloat - самописная функция, которую б3д берёт из DLL-ки.
snprintf(MyGlobalString,sizeof(MyGlobalString),"%.*f",L,x);
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
Последний раз редактировалось impersonalis, 28.01.2013 в 18:10.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:44.
|