Математика в Blitz3D
Сколько твердили миру, что Blitz3D - не для математических расчётов, но - нет: я опять взялся писать странющую прогу, прельщённый лёгкой поддержкой графических форматов и простотой синтаксиса. То что уже было мною набрано на С++ я портировал на b3d и тут понеслось.
Пример раз: Код:
Graphics 800,600 Делаем "волшебную" конвертацию типов число->строка->число Код:
b=Float(Str(b)) Код:
Потрясающе! Мой 80кб-ый алгоритм прекрасно работал и обработал несколько сотен значений, пока я не получил на выходе коэффициент корреляции, превосходящий единицу! Программа сгенерировала 16-листов формата А4 вычислений. И всё это пришлось проверять вручную, затем ковыряться в логе отладчика (я впервые пожалел, что в нём нет поиска) - и всё это из-за одного числа. Пример два: Оператор INT в Blitz3D, в отличие от C++ не отбрасывает дробную часть, а округляет число. о_0 Для меня было неожиданностью. Пример три: Переполнение буфера отладчика поможет вам сойти с ума в процессе отладки рабочего алгоритма: http://www.boolean.name/showthread.php?t=550 Пример 4етыре: В ходе написания всё той же проги я столкнулся и с тем что сумма целых чисел волшебным образом преобразуется из например 6 в 5.999, если переменные, используемый в вычисленяих были float-типа. -------------------- Я НЕ СУМАСШЕДШИЙ! |
Re: Математика в Blitz3D
о последнем кажется ещё Jimon упомиинал :)
|
Re: Математика в Blitz3D
ага было такое
когда делиш на 0 и ошибки не выскакивает 0 магическим способом превращается в 0.00001 :) |
Re: Математика в Blitz3D
Цитата:
Так - а первый пример у всех работает неправильно? |
Re: Математика в Blitz3D
Тест на С++ показал, что проблема в типе переменной. Корректно начинает работать с 8-байтовыми (double)
Код:
#include<iostream.h> Цитата:
|
Re: Математика в Blitz3D
странно... надо на разных компах посмотреть
обычно double имеет привычку "плыть" .... сорс пришлось поправить :) а то там с stl трабла :) компиляторы разные но результат с тобой одинаковый * тут че то не то :) |
Re: Математика в Blitz3D
Достаточно такую штуку написать:
Код:
float t1; Код:
if (t1==float(t2)) Но встает вопрос, почему то же самое творится в блице, если там только float. Код:
x=14.143 |
Ответ: Математика в Blitz3D
Видимо, это какой-то масонский заговор во главе с Марском Сибли... :wild:
|
Ответ: Математика в Blitz3D
хех...
Код:
x#=14.143 Код:
x#=14.143 |
Ответ: Математика в Blitz3D
Программисты, сколько можно, ну всюду же везде в любой книге пишут что нельзя применять оператор сравнения = для переменных с плавающей точкой. Т.к. переменные с плавающей точкой имеют ограничение по точности, и 2е переменные типа float будут равны только в случае если они обе были установлены идентичными выражениями или установлены одна от другой.
Повторим ещё раз "Оператора = для переменных с плавающей запятой несуществует" |
Ответ: Математика в Blitz3D
2SBJoker вы сударь последнее время критикуете всё с такой яростью, что вам в пору иметь более брутальный никнейм, это во-первых. Во-вторых, что за традиция ссобщать всё пост-фактум? До последнего молчать обо всех алгоритмических изысках,а потом "бойааанЪ". В-третьих, я не встречал высказнного вами "очевидного" правила ни в одной (!) прочитанной книге. В-четвёртых это нихрена не очевидно, что функция вывода возрващает число Х, которое на саммом деле нифига не Х (при том, что функция никак не модифицирует число) и, в-пятых, совсем колдунство - пропускание флоат-а через String type cast. В-шестых:
Цитата:
В-седьмых: концепт "Злобный Модератор" вырождается в концепт "Злобный дед", такие люди читают орфографическое правило с примером неверного написания слова, и забыв про контекст, черкают ручкой ошибочное место. Попутно послыая и автора и отсальных читателей. 2IGR и? ты повторил кусок моей заметки с моим выводом - и что? |
Ответ: Математика в Blitz3D
Цитата:
Цитата:
Цитата:
Вот пример: "Избегайте сравнений на равенство. Числа с плавающей запятой, которые должны быть равны, на самомо деле равны невсегда. Главная проблема в том, что два разных способа получить одно и тоже число не всегда приводит к одинаковому результату." "Совершенный код", С.Макконелл, издательства Microsoft, Питер, Русская редакция/ стр.286, последний абзац. Всем очень рекомендую почитать эту книгу, даже самые самоувереные гуру-программисты найдут много полезного и то чего они сами незнали. Цитата:
Цитата:
|
Ответ: Математика в Blitz3D
Вот специально решил выложить инфу из MSDN по типам переменных, это актуально и для встроенных типов Blitz3D:
Цитата:
А теперь о несуществующем в Blitz3D типе double, которых бы всех спас. Цитата:
напомню типа double нет в BlitzD, но он есть в BlitzMAX, C#, C++ |
Ответ: Математика в Blitz3D
SBJoker
молодец, правильно все объяснил. добавлю вот что: стек FPU 80битный, float 32бита, double - 64. пока вычисления происходят без сохранения в память из стека FPU - точность 80битная (это правда зависит от флагов FPU). как только сохраняем значение в переменную - происходит отсечение (SBjoker об этом и сказал). также стоит знать про машинный эпсилон (наименьшее представимое число с заданной разрядной сеткой). еще надо помнить, что формат IEEE 754 предусматривает повышение точности в области чисел в диапазоне 0..1 (хотя память мне тут может изменять, смотрите номрализованную и денормализованную форму числе с плавающей точкой). так что не пугайтесь, когда видите, что 10.0 показывается как 9,999999. все так и зажумано:) |
Ответ: Математика в Blitz3D
impersonalis, сорри, очень бистро просмотрел пост - неувидел !!
SBJoker, спасибо за книгу !! |
Ответ: Математика в Blitz3D
по-моему все это обходят вычитанием и сравнением с требуемым уровнем точности
if x1:float - x2:float < 0.00000001 then equals. |
Ответ: Математика в Blitz3D
Цитата:
|
Ответ: Математика в Blitz3D
Да :-D
А говорить, что "не сравнивайте числа с плавающей запятой" - это жестоко. |
Цитата:
Цитата:
Иначе говоря на равенство сравнивать float нельзя никаким способом. Т.к. любой описанный вами способ с разной степенью вероятности будет врать. |
Ответ: Математика в Blitz3D
Код:
Local x#=14.143+0.000001 Цитата:
На самом деле: и флоата хватает и блитц всё посчитал правильно - далее в логе читаем: Цитата:
Арифметические результаты не отличаются от аналогичных в MinGW (включая мусор на младших разрядах при излишней точности). |
Ответ: Математика в Blitz3D
Ах - забыл уточнить: GetMyFloat - самописная функция, которую б3д берёт из DLL-ки.
|
Часовой пояс GMT +4, время: 06:32. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot