Float/ru

From Second Life Wiki
< Float
Revision as of 04:54, 20 July 2013 by Fashion Atlas (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

См. также

Статьи