[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: математика в php
vcjaenhy
Приветствую.



for($i=0.00000; $i<=1; $i+=0.00001){
echo $i."<br>";

}


в начале все терпимо , но потом

0.00532
0.00533
0.00534
0.00535
0.0053599999999999
0.0053699999999999
0.0053799999999999

1) можете объяснить почему движок считает так
2) можете сказать как починить?


единственное, что смог придумать bcadd ($i, '0.00001', 9);

почему калькулятор такой кривой в движке?

walerus
vcjaenhy
А какая цель задачи вообще? может подход иной нужен?
vcjaenhy
walerus
что-то вроде формирования мат рядов, эксперимент поиска закономерностей десятичных дробей, для граф отображения.
Проблема в другом если так сложение чихает, что будет с делением
sergeiss
Это не ПХП виноват, это специфика работы компа с вещественными числами. Бороться с этим невозможно, но можно и нужно учитывать.
В данном случае лучше сделать цикл по целым числам и уже внутри цикла получать нужное вещественное число. С целыми числами такой проблемы нет и быть не может.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vcjaenhy
sergeiss

Это не ПХП виноват, это специфика работы компа с вещественными числами.

т.е.

любой язык так себя будет вести, на этой машине?

сделать цикл по целым числам...
т.е. на выходе
1/10000 = 0,0001

а если использовать bcadd будут проблемы или просто дольше?

sergeiss
vcjaenhy это будет в любом языке на любом компе. Абсолютной точности не будет.

Насчет bcadd ничего сказать не могу.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vcjaenhy
sergeiss
а с делением как быть тогда?
sergeiss
Цитата (vcjaenhy @ 23.12.2019 - 22:41)
а с делением как быть тогда?

А что не так с делением? Там тоже будет некоторая точность. Если ты просто разделишь одно число на другое, то всё будет нормально. Если будешь в цикле многократно делить, делить и делить, то да, ошибка может накапливаться. Надо просто понимать это и учитывать.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Эли4ка
Цитата (vcjaenhy @ 23.12.2019 - 18:54)
что-то вроде формирования мат рядов, эксперимент поиска закономерностей десятичных дробей, для граф отображения.

Хочу вам напомнить, что php скриптовый язык общего назначения для разработки веб-приложений.
Ряды, интегралы и прочее отсутствуют в реализациях в виде функций.
Python попробуйте.
killer8080
Цитата (vcjaenhy @ 23.12.2019 - 17:50)
почему калькулятор такой кривой в движке?

никакого калькулятора в PHP нет, он работает с числовыми типами так же, как и все остальные ЯП. Проблема эта не программная, а чисто математическая. Между нулем и единицей существует бесчисленное множество вещественных чисел, а вот разрядность процессора далеко не безгранична, потому реальные числа имеют ограниченную точность. Недоразумений еще и добавляют системы счисления. ЦП работает исключительно в двоичном режиме и все числа в нем представлены в двоичной форме. Для человека это мягко говоря неудобно, потому вся ЯП позволяют программисту использовать десятичную форму представления, привычную человеку. В любой системе счисления существуют числа, которые не имеют конечного представления в данной системе. Например число 1/3 не имеет конечного представления в десятичной, а в двоичной числа 0.1 и 0.7. Из-за этого возникают накладки вида

0.1 + 0.7 != 0.8


Какой бы ЯП ты не использовал никогда нельзя строить циклы ни инкременте вещественных чисел, так же их нельзя использовать для точного сравнения.
vcjaenhy
понял, спасибо, ребят
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.