Float/ru
LSL Портал | | | Функции | | | События | | | Типы | | | Константы | | | Потоки | | | Библиотека Скриптов | | | Учебники |
К типу данных с плавающей точкой относятся 32-битные числа в IEEE-754 форме, то есть числа с плавающей точкой относятся к вещественному типу.
Если Вам нужна десятичная точка в своём числе, то примените вещественный тип чисел float
.
Диапазон значений в пределах от 1.175494351E-38 до 3.402823466E+38 .
Они могут быть указаны в научной нотации, наподобие 2.6E-5 .
Если функция требует плавающую точку в качестве параметра, и число является целым числом (например, 5), то не забудьте добавить .0 - так создается float
(в нашем примере, 5.0).
Если вы делите 2 константы, не забудьте определить их вещественными числами, иначе ваш результат может получить округление. А еще лучше, вычислять математику на калькуляторе и сохранить на сервере несколько циклов.
Пример
<lsl>float min = 1.175494351E-38; float max = 3.402823466E+38; float sci = 2.6E-5; float sci_a = 2.6E+3; float sci_b = 2.6E3; float sci_c = 26000.E-1; float f = 2600;//неявное приведение к типу 'float' float E = 85.34859; float cast = (float)"42";//явное приведение к типу 'float' float Infintity = (float)"inf"; //-- могут быть отрицательными, приведет к ошибке, если математика оценивалась в LSO, см. 'предостережения' ниже float NotANumber = (float)"nan"; //-- могут быть отрицательными, приведет к ошибке, если математика оценивалась в LSO, см. 'предостережения' ниже </lsl>
Полезные фрагменты
Если вам нужно для проверки произвольных float
без ограничений, то следующая функция идеально здесь подходит:
<lsl>integer isValidFloat(string s) { return (string)((float)s) != (string)((float)("-" + llStringTrim(s, STRING_TRIM_HEAD))); }</lsl>
Тем не менее, следующий фрагмент более эффективен, но проходит с отмеченными оговорками. Если это не проблема для Вас, то это рекомендуемый вариант, особенно в режиме скрипта Mono: <lsl>integer isValidFloat(string s) { return (float)(s + "1") != 0.0; }</lsl> Предостережения:
- Под LSO-LSL научная нотация (экспоненциальная) с показателем больше 38 не удаётся (вкрадывается математическая ошибка). Mono не влияет, так как поддерживает
infinity
- Под Mono и LSO-LSL вы можете обнаружить странные результаты, если имеете дело со строкой содержащей более 9 знаков после запятой. Помните, что приведение (распределение) строки в LSL дает только до 6 знаков безопасно, и вследствие человеческого фактора редко будет точной, но также малые значения обычно не все, что полезно.
- "nan", "inf" и их негативы есть специальными значениями текста, которые можно привести из строки (с любым пробелами или конечными символами). Это значение приведет к математической ошибке, когда переменная оценивается в LSO. Если Вы разбираете пользовательские данные, путем приведения строки в обращении, используйте следующий код (заменив vStrDta с вашим именем переменной String) см. SVC-6847
- <lsl>(float)llList2String( llParseStringKeepNulls( llToLower( llStringTrim( vStrDta, STRING_TRIM ) ), ["inf", "nan"], [] ), 0 )</lsl>
Float-to-String
Есть несколько способов преобразования с float
в string. Первый - приведение в строку (string)(1.0), что, однако, имеет недостаток округления и ограничивается до шести знаков после точки. Некоторые функции были написаны для обеспечения больших возможностей. Они делятся на две категории, без потерь (Lossless functions) и с потерями (Lossy functions).
Название | inf/nan | Округление | Сокращение | Пояснения |
---|---|---|---|---|
Typecast | Да | Да | Нет | (float)float_value дает только в режиме "Mono" скрипта 6 знаков точности. |
Format Decimal | Нет | Да | Нет | |
Float2String | Нет | Да | Да |
Название | Скорость | Обратимость | inf/nan support | PI PI | Пояснения |
---|---|---|---|---|---|
Float2Hex | Быстрая | (float)
|
Нет | 0x6487ED5p-25 | Поскольку выход в шестнадцатеричной научной записи, это не совсем визуально читабельно. |
Float2Sci | Медленная | (float)
|
Нет | 3.1415925 | Полезно, если вы хотите, чтобы результат был без потерь и визуально читабельный, происходит за счет низкой скорости. |
FUIS | Быстрейшая | SIUF | Нет | "QEkP2g" | Вовсе не читабельно. Гарантированно всегда использование шести символов. |
- Infinity (бесконечность) доступна только в Mono.
См. также
Статьи
- LSL Примеры: Format Decimal