Difference between revisions of "Float/ru"
(Первопроходец) |
(упорядочить) |
||
Line 51: | Line 51: | ||
{| class="sortable" {{Prettytable}} | {| class="sortable" {{Prettytable}} | ||
|+ Lossy functions | |+ Функции с потерями (Lossy functions) | ||
|- {{Hl2}} | |- {{Hl2}} | ||
! | ! Название | ||
! title="Infinity / NaN support" {{!}} inf/nan | ! title="Infinity / NaN support" {{!}} inf/nan | ||
! | ! Округление | ||
! | ! Сокращение | ||
! | ! Пояснения | ||
|- | |- | ||
| Typecast | | Typecast | ||
| | | Да | ||
| | | Да | ||
| | | Нет | ||
| <code>(float)float_value</code><br>Mono | | <code>(float)float_value</code><br>дает только в режиме "'''Mono'''" скрипта [https://jira.secondlife.com/browse/SCR-397?focusedCommentId=340847&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-340847 6 знаков точности]. | ||
|- | |- | ||
| [[Format Decimal]] | | [[Format Decimal]] | ||
| | | Нет | ||
| | | Да | ||
| | | Нет | ||
| | | | ||
|- | |- | ||
| [[Float2String]] | | [[Float2String]] | ||
| | | Нет | ||
| | | Да | ||
| | | Да | ||
| | | | ||
|} | |} | ||
{| class="sortable" {{Prettytable}} | {| class="sortable" {{Prettytable}} | ||
|+ Lossless functions | |+ Функции без потерь (Lossless functions) | ||
|- {{Hl2}} | |- {{Hl2}} | ||
! | ! Название | ||
! | ! Скорость | ||
! | ! Обратимость | ||
! title="Infinity / NaN support" {{!}} inf/nan support | ! title="Infinity / NaN support" {{!}} inf/nan support | ||
! [[PI]] | ! [[PI]] [[PI/ru|PI]] | ||
! | ! Пояснения | ||
|- | |- | ||
| [[Float2Hex]] | | [[Float2Hex]] | ||
| | | Быстрая | ||
| <code>(float)</code> | | <code>(float)</code> | ||
| | | Нет | ||
| 0x6487ED5p-25 | | 0x6487ED5p-25 | ||
| | | Поскольку выход в шестнадцатеричной научной записи, это не совсем визуально читабельно. | ||
|- | |- | ||
| [[Float2Sci]] | | [[Float2Sci]] | ||
| | | Медленная | ||
| <code>(float)</code> | | <code>(float)</code> | ||
| | | Нет | ||
| 3.1415925 | | 3.1415925 | ||
| | | Полезно, если вы хотите, чтобы результат был без потерь и визуально читабельный, происходит за счет низкой скорости. | ||
|- | |- | ||
| [[User:Strife_Onizuka/Float_Functions#Base64-Float|FUIS]] | | [[User:Strife_Onizuka/Float_Functions#Base64-Float|FUIS]] | ||
| | | Быстрейшая | ||
| [[User:Strife_Onizuka/Float_Functions#Base64-Float|SIUF]] | | [[User:Strife_Onizuka/Float_Functions#Base64-Float|SIUF]] | ||
| | | Нет | ||
| "QEkP2g" | | "QEkP2g" | ||
| | | Вовсе не читабельно. Гарантированно всегда использование шести символов. | ||
|} | |} | ||
* | *Infinity (бесконечность) доступна только в '''Mono'''. | ||
<div id="box"> | |||
== См. также == | |||
<div style="padding: 0.5em"> | |||
'''Артикли''' | |||
*LSL Примеры: [[Format_Decimal|Format Decimal]] | |||
</div> | |||
</div></div> | </div></div> |
Revision as of 03:32, 8 June 2013
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
К типу данных с плавающей точкой относятся 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