Float/ru

From Second Life Wiki
< Float
Revision as of 03:54, 20 July 2013 by Fashion Atlas (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

К типу данных с плавающей точкой относятся 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).

Функции с потерями (Lossy functions)
Название inf/nan Округление Сокращение Пояснения
Typecast Да Да Нет (float)float_value
дает только в режиме "Mono" скрипта 6 знаков точности.
Format Decimal Нет Да Нет
Float2String Нет Да Да
Функции без потерь (Lossless functions)
Название Скорость Обратимость inf/nan support PI PI Пояснения
Float2Hex Быстрая (float) Нет 0x6487ED5p-25 Поскольку выход в шестнадцатеричной научной записи, это не совсем визуально читабельно.
Float2Sci Медленная (float) Нет 3.1415925 Полезно, если вы хотите, чтобы результат был без потерь и визуально читабельный, происходит за счет низкой скорости.
FUIS Быстрейшая SIUF Нет "QEkP2g" Вовсе не читабельно. Гарантированно всегда использование шести символов.
  • Infinity (бесконечность) доступна только в Mono.

См. также

Статьи