forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Математика в Blitz3D (http://forum.boolean.name/showthread.php?t=2451)

dimanche13 13.01.2009 16:05

Ответ: Математика в Blitz3D
 
по-моему все это обходят вычитанием и сравнением с требуемым уровнем точности
if x1:float - x2:float < 0.00000001 then equals.

impersonalis 13.01.2009 16:08

Ответ: Математика в Blitz3D
 
Цитата:

if x1:float - x2:float < 0.00000001 then equals.
if fABS(x1:float - x2:float) < 0.00000001 then equals.

johnk 13.01.2009 16:39

Ответ: Математика в Blitz3D
 
Да :-D
А говорить, что "не сравнивайте числа с плавающей запятой" - это жестоко.

SBJoker 13.01.2009 17:39

Цитата:

Сообщение от JohnK (Сообщение 94626)
Да :-D
А говорить, что "не сравнивайте числа с плавающей запятой" - это жестоко.

Почитай посты повнимательнее, "не сравнивайте на равенство числа с плавающей запятой". Другими словами не юзаем оператор "равно", остальные юзать можно и нужно.

Цитата:

Сообщение от dimanche13 (Сообщение 94621)
по-моему все это обходят вычитанием и сравнением с требуемым уровнем точности
if x1:float - x2:float < 0.00000001 then equals.

К сожалению это может несработать, т.к. точность float 7 знаков, а не 8 или 9 как у вас... К тому же в зависимости от числа символов целой части дробная часть может сжиматься вплоть до 0 знаков

Иначе говоря на равенство сравнивать float нельзя никаким способом. Т.к. любой описанный вами способ с разной степенью вероятности будет врать.

impersonalis 28.01.2013 13:49

Ответ: Математика в 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 (включая мусор на младших разрядах при излишней точности).

impersonalis 28.01.2013 13:57

Ответ: Математика в Blitz3D
 
Ах - забыл уточнить: GetMyFloat - самописная функция, которую б3д берёт из DLL-ки.

Код:

#include <stdio.h>
Код:

snprintf(MyGlobalString,sizeof(MyGlobalString),"%.*f",L,x);


Часовой пояс GMT +4, время: 12:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot