В bcmul() обрезана воспринимаемая десятичная часть?

.R1

Новичок
В bcmul() обрезана воспринимаемая десятичная часть?

PHP:
bcscale(33);
echo bcmul(1E-4, 2E-3); // 0.0000002
echo bcmul(1E-4, 2E-5); // 0.0000
Функция bcmul() при работе с числами меньше 0.00001 возвращает ноль (!). Вот от кого не ожидал!

Конечно, в этом случае обычное умножение работает.
PHP:
echo 1E-4 * 2E-5; // 2E-009
Но моя небольшая вычислительная система абсолютно не справляется со своими задачами стандартными арифметическими операциями PHP (которые вызывают моментальное расхождение вследствие ошибок округления). А именно: требуется много складывать числа меньше единицы и много умножать числа порядка 10000 на числа порядка 0.00001.

Причем другие функции bcmath, в отличие от bcmul, выдавали вполне ожидаемый результат. Такое впечатление, что точность умножения где-то задается. Как известно, в php.ini есть лишь bcmath.scale, которая не повлияла на bcmul, даже после установки значения 20.

Самое интересное, что я не нашел нигде упоминания этой особенности функции bcmul(). Возможно, есть какое-то объяснение в зависимости от платформы или сервера.

Тестировано на php 4.4, 5.1; Linux, Win; apache 1, 2 - короче без разницы.

Есть какие-нибудь выходы из такой ситуации?
 

.R1

Новичок
Спасибо, оказалось что недостаточно хорошо читал ман. Проблема была на утро найдена в bugtrack. Суть её сводится к следующему:

If you pass the numbers as strings (as expected, although the manual has
it wrong in the example), this works fine:
PHP:
bcmul("1", "0.00001", 5);
Reclassified as documentation issue. (the bad examples in bcmath
section)
Осталось проследить, чтобы все переменные хранились в string, а не float.

Надеюсь, этот тред пригодится другим пользователям форума.
 
Сверху