Помощь - Поиск - Пользователи - Календарь
Полная версия: Frac(x)
UoKit.com Форумы > Кликер > UO Pilot
cirus
set #a frac(16384,444)
log #a
stop_script

16384,4 - возвращает 4
16384,44 - возвращает 44
16384,444 - возвращает 0 //?????
16384,445 - возвращает 445

100000,488 - возвращает 488
100000,489 - возвращает 0 //?????

Проблема как с десятичными, так и сотыми и тысячными долями. Проблемы начинаются с числами выше 16000 (примерно).

//Если использовать строковые переменные, то уже интереснее:
set $a frac(16384,444)
log $a
stop_script

Возвращает 444000000000001 // Что это? smile.gif

Можно с числами поэкспериментировать.
Код
log clear
set linedelay 0
for #j 16383 16384
    for #i 40 50
set %a [1] #j,#i
    set %b[1] frac(%a[1])
   log %a[1] - %b[1]
end_for
end_for
stop_script
DarkMaster
Цитата
Возвращает 444000000000001 // Что это?

Вот это как раз боюсь можно объяснить. Скорее всего для хранения используется переменная с плавающей точкой. Ее особенность в том, что у нее есть понятие точности. Можете почитать, если хотите. Тут скорее всего ошибочно выбран тип переменной внутри обрабатывающей функции. Хотя несколько удивляет, т.к. скорее всего функция пилота представляет собой простое обращение к стандартным функциям делфи и преобразований сам пилот делать не должен.
Destruction
DarkMaster, более того - это вероятно объясняет откуда сами нули лезут, - вероятно идет переполнение буфера при преобразовании типа или что-то в этом духе (например срабатывает проверка возвращающая 0).

То что пилот обращается к функциям delpi - никоим образом не меняет того, что что число 444000000000001 не влезет в 4 байта, отсюда очевидно и растут ноги.

Вероятно стоит просить кнайта переходить на использование gmp для всей математики (в рамках языка пилота точные вычисления любых чисел выглядели бы более логично, исходя из входного порога в этот язык)..
WKnight
Особенность вычислений\преобразований чисел с плавающей запятой.

frac() переделал, обращаться к математическим функциям на самом деле небыло необходимости. теперь функция просто обрезает входную строку по точке\запятой. Может использоваться и с символьными строками.
DarkMaster
Цитата
теперь функция просто обрезает входную строку по точке\запятой. Может использоваться и с символьными строками.

А если подсунуть строку вида:
set $a qwe.asd
То frac вернет qwe?
cirus
Цитата
А если подсунуть строку вида:
set $a qwe.asd
То frac вернет qwe?

Может asd, он же дробную часть должен возвращать.
WKnight
Все после первой запятой, а если запятой не найдено, то первой точки.
DarkMaster
Я в смысле, что наш frac() будет обрабатывать текст - это очень забавно)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.