floatcmp

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск

Описание:

Сравнивает два вещественных числа.

Параметры:

(Float:oper1, Float:oper2)
Float:oper1 Операнд 1.
Float:oper2 Операнд 2.


Возвращаемое значение:

  • 1, если oper1 > oper2
  • -1, если oper1 < oper2
  • 0, если oper1 == oper2

Info rhombus.png
Примечание
Функция вызывается в неявном виде при сравнении двух вещественных чисел с помощью операторов ==, !=, >, <, >= и <=. При этом функция вызывается не напрямую, а через функцию-оболочку, которая в свою очередь возвращает 1 или 0 в зависимости от результата, возвращённого floatcmp().
Пример такой функции-оболочки (из float.inc):
stock bool:operator>(oper1, Float:oper2)
    return floatcmp(float(oper1), oper2) > 0;
Вызов функции-оболочки занимает лишнее время, поэтому в критичных ко времени выполнения ситуациях может быть целесообразно вызывать floatcmp() вручную вместо использования операторов сравнения.
Для проверки на равенство/неравенство (==, !=) также можно использовать оператор переопределения тега : и сравнивать оба числа, как целые, избежав лишних затрат на вызов нативной функции:
if(_:value1 == _:value2)
Осторожно: данная оптимизация не интуитивна и её можно использовать только для проверки на равенство/неравенство. Кроме того, выражение _:0.0 == _:-0.0 выдаст 0, как будто числа не равны, однако floatcmp() считает эти числа одинаковыми (см. пример ниже).


Пример использования:

PrintFloatCmp(Float:oper1, Float:oper2)
{
    printf("floatcmp(%.02f, %.02f): %d", oper1, oper2, floatcmp(oper1, oper2));
}

main()
{
    PrintFloatCmp(2.0, 1.0);  // "floatcmp(2.00, 1.00): 1"
    PrintFloatCmp(1.0, 2.0);  // "floatcmp(1.00, 2.00): -1"
    PrintFloatCmp(1.0, 1.0);  // "floatcmp(1.00, 1.00): 0"
    PrintFloatCmp(0.0, -0.0); // "floatcmp(0.00, 0.00): 0"
}