Float/ru

From Second Life Wiki
< Float
Revision as of 04:04, 8 June 2013 by Fashion Atlas (talk | contribs) (Первопроходец)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to 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
Name inf/nan Rounding Truncation Notes
Typecast Yes Yes No (float)float_value
Mono only gives 6 digits of precision.
Format Decimal No Yes No
Float2String No Yes Yes
Lossless functions
Name Speed Reversible inf/nan support PI Notes
Float2Hex Fast (float) No 0x6487ED5p-25 Since the output is in the Hexadecimal Scientific Notation, it's not really human readable.
Float2Sci Slow (float) No 3.1415925 Useful when you want the result to be lossless but also human readable, comes at the cost of speed.
FUIS Fastest SIUF No "QEkP2g" Not at all human readable. Guarantied to always use six characters.
  • Бесконечность доступна только в Mono.