Господа, кто-нибудь в курсе, существует ли extention для PHP, реализующее работу с бесконечными целыми числами?
Ну, т.е. чтобы формат подразумевал динамическое выделение такого участка памяти под хранение числа, чтобы оно в него поместилось.
И чтобы он умел складывать, вычитать и умножать и делить. Деление тоже целочисленное – чтобы возвращало два целых – результат и остаток от деления.
bcmath
Спасибо. Почитал, сейчас попробую.
Жалко только, что у неё все числа только в строках живут.
Т.е. как я понимаю, например, при вычислении $a = ($b + $c) * ($d + $e)
сперва b,c,d,e будут перекинуты из строкового представления во внутреннее, потом каждая сумма будет из внутреннего представления перекинута обратно в строковое, потом оба этих строковых представления будут перекинуты во внутреннее, а после умножения результат снова будет перекинут в строковое.
Опасаюсь, что на все эти ненужные хреновины основное время будет тратиться. Было бы круто, если бы экземпляр числа был каким-то специальным объектом, который всегда хранит данные во внутреннем представлении и оперирует им, а строковое человеческое представление как раз возвращал бы только по специальной просьбе.
ну как минимум $a = bcmul(bcadd($b, $c), bcadd($d, $e))
Беру слова обратно. Охуенно работает.
*голосом Василия Уткина*
в этом итт треде программисты на ппхпххпхпхпхп ищут либу для длинной арифметики, без которой обходятся даже школьники на олимпиадах. на втором комменте подходит к осознанию необходимости использования BCD, но так и не может сделать решающий шаг.
Stephan-V: Мне длинная целая арифметика нужна для хранения промежуточных резульататов в рациональных дробях, что по возможности старается делать любая хоть немного уважающая себя софтина, начиная с виндового калькулятора.
А сейчас по ряду причин нужно, увы, на PHP. Я его и впрямь мало знаю, у меня был стандартный путь программера,
начинающего писать подростком в разгар перестройки -> spectrum basic -> turbo pascal & tasm -> C / C++, сейчас в основном C# и java.
тогда тебе не о чем беспокоиться: тормоза от самого факта использования php таковы, что об использовании строк вместо BCD волноваться не приходится
ты так говоришь “увы”, как будто бы между php и другими языками программирования (например, теми же turbo pascal, C++ или java) есть какая-то разница.
да вообще нкиакой.
Это “увы” из области личных предпочтений. Меня раздражает динамическая типизация и общая неряшливость. Лично мне, чтобы чисто писать на PHP, требуется очень напрягать самодисциплину и самостоятельно следить за теми вещами, за которыми обычно следит компилятор. Не готов обосновать своё мнение.
странно, учитывая trubo pascal & tasm в послужном списке.
Мне напрягать ничего не требуется, я на любом языке слежу за всем, чем могу и что знаю. После асма как-то само собой развилось.
динамическая типизация развивает самоконтроль.
вообще человек, который не знает, что делает компьютер, выполняя его код, есть быдлокодер.
Мне кажется, как раз асм и PHP вообще на разных полюсах именно в этом смысле. Т.е. PHP меня раздражает тем, что всё прощает и молча принимает самостоятельные решения в меру своего “понимания” текущего контекста, а асм за программиста не сделает вообще ничего. Поэтому асм как раз заставлял следить. А в PHP приходится самостоятельно. Скажем, если в asm-е у тебя где-то переполнение целого, ты это быстро заметишь. А PHP тихо и молча перейдёт на плавающую точку. С погрешностью. А потом ебись часами и думай, откуда у тебя одна лишняя копейка нарисовалась в таблице с суммами.
всё это у тебя в голове 🙂 я пишу не программу на предоставленном языке, я пишу команды для процессора, используя предоставленные языком или написанные собственноручно обёртки для этих асм-команд. Удобно, когда обёртки высокоуровневые, типа как в java, но удобство не должно затмевать основной мысли.
вы пытаетесь прострелить себе ногу, но обнаруживаете, что прежде вам придется изобрести пистолет, пулю, курок и вашу ногу.
в PHP есть явное приведение типов. нужно контролировать контекст и то, что хочешь получить – тогда не возникает проблем в таблице с суммами (более того, работа с финансами вообще должна прививать жёсткий контроль и заставлять вводить кучу ограничений даже там, где по идее не ожидается никаких проблем).
ещё есть assert() и контрактное программирование.
erlang
в эрланге длинная арифметика из коробки работает только для целых чисел. для дробных там та же самая хуйня
Stephan-V: А мне для целых и надо, я же с рациональным дробями работаю.
ну попробуй эрланг, он строгий и красивый