За последние 24 часа нас посетили 22543 программиста и 1280 роботов. Сейчас ищут 817 программистов ...

Замена BCMath

Тема в разделе "PHP для новичков", создана пользователем AterCattus, 10 июл 2008.

  1. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    На сервере отсутствует поддержка функций модуля. По крайней мере function_exists их не находит и вызов приводит к падению скрипта.

    Пытался их заменить на самопальные, но толку не вышло. Брал примеры на php.net (в описания функций приводились аналоги).

    PHP:
    1.     if ( !function_exists('bcadd') ) {
    2.         function bcadd( $left_operand, $right_operand, $scale = 0 ) {
    3.             return round( $left_operand + $right_operand, $scale );
    4.         }
    5.     }
    6.    
    7.     if ( !function_exists('bcsub') ) {
    8.         function bcsub( $left_operand, $right_operand, $scale = 0 ) {
    9.             return round( $left_operand - $right_operand, $scale );
    10.         }
    11.     }
    12.    
    13.     if ( !function_exists('bcmul') ) {
    14.         function bcmul( $left_operand, $right_operand, $scale = 0 ) {
    15.             return round( $left_operand * $right_operand, $scale );
    16.         }
    17.     }
    18.    
    19.     if ( !function_exists('bcpow') ) {
    20.         function bcpow( $num, $power, $scale = 0 ) {
    21.             $awnser = "1";
    22.             while ($power) {
    23.                 $awnser = bcmul($awnser, $num, 100);
    24.                 $power = bcsub($power, "1");
    25.             }
    26.             return rtrim($awnser, '0.');
    27.         }
    28.     }
    29.    
    30.     if ( !function_exists('bcmod') ) {
    31.         function bcmod( $x, $y ) {
    32.             $take = 5;
    33.             $mod = '';
    34.            
    35.             do {
    36.                 $a = (int)$mod.substr( $x, 0, $take );
    37.                 $x = substr( $x, $take );
    38.                 $mod = $a % $y;
    39.                
    40.             } while ( strlen($x) );
    41.            
    42.             return (int)$mod;
    43.         }
    44.     }
    45.    
    46.     if ( !function_exists('bcdiv') ) {
    47.         function bcdiv( $x, $y, $scale = 0 ) {
    48.             $res = $x / $y;
    49.             return round( $res, $scale );
    50.         }
    51.     }
    Ткните что не так, ибо ранее с такими числами на php не работал. Все как-то в системном программировании (C да Asm) работал с bigInt.

    P.S. Цель - не работает wmsigner - вычисляется некорректная подпись. Весь остальной код уже проверен (на сервере с поддержкой bcMath все работает).
     
  2. Anonymous

    Anonymous Guest

    bcmath не работает как раз с числами как таковыми. она работает с их строковыми представлениями. т.е. это надо реализовывать сложение\вычитаение поразрядно, ручками.
     
  3. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    да, я в курсе ;-) просто непонятен смысл тогда этих примеров в описании функций.

    да и вычисление скажем pow( 1.22334E+127, 1027 ) ручками надолго охладит пыл системы ;-)
    p.s. числа почти с потолка.