Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Ребята, растолкуйте что к чему нужно привести, что бы ноль получился: Код: php 1. 2. 3. 4. дает такой результат -8.8817841970013E-16 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 23:56 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
http://php.net/manual/ru/language.types.float.php Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции. Там же и методика обработки подобных случаев описана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 00:17 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
vkle http://php.net/manual/ru/language.types.float.php Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции. Там же и методика обработки подобных случаев описана. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 00:36 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
cylbps, а за что спасибо-то? мне никогда не было понятно, почему я должен говорить спасибо за то, что 0.1 + 0.2 не равно 0.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2016, 14:10 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661cylbps, а за что спасибо-то? мне никогда не было понятно, почему я должен говорить спасибо за то, что 0.1 + 0.2 не равно 0.3 Не надо благодарить. прими как факт :) А винить в этом надо не компьютер или компилятор, а того, кто решил, что десятичная система оптимальна для счёта (разумеется помним, что 10 именно потому, что у нас 10 пальцев). Просто не любая конечная десятичная дробь является конечной двоичной дробью (и наоборот). И дело не в том, что 0.1+0.2!=0.3... дело в том, что 0.1 в двоичной системе уже не получится записать. Если переводить 0.1 в двоичную систему то: 0.1*2 = 0.2 | 0 0.2*2 = 0.4 | 0 0.4*2 = 0.8 | 0 0.8*2 = 1.6 | 1 0.6*2 = 1.2 | 1 0.2*2 = 0.4 ---> тут бесконечный цикл со второй по пятую операцию 0.1(10) = 0.0[0011](2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2016, 16:39 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Програмёрприми как факт Код: php 1. True Два мира - два Шапиро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2016, 12:50 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661Програмёрприми как факт Код: php 1. True Два мира - два Шапиро Код: php 1. Результат: 1 (то есть true) P.S. Как думаешь, почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2016, 03:30 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Програмёр, тебе не заметна разница в написании ? Код: sql 1. и Код: sql 1. ПрограмёрРезультат: 1 (то есть true) а что 1 есть true - это, стало быть, ты мне пояснил ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 04:45 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
В python, java, php выражение 0.1 + 0.2 == 0.3 ложное, что там происходит в питоне лично я не знаю, может кто-то пояснит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 12:14 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661Програмёр, тебе не заметна разница в написании ? Код: sql 1. и Код: sql 1. ПрограмёрРезультат: 1 (то есть true) а что 1 есть true - это, стало быть, ты мне пояснил ? Итак... посидел, поэкспериментировал, что бы увериться, что я прав. На пятом перле "print 0.1+0.2==0.3" молчит (то есть выражение ложно) на шестом перле "print 0.1+0.2==0.3" выводит True Отсюда вывод, что на шестом перле числа проходят некоторое преобразование, которое не проходили в perl5 проверяем теорию тестом (не стал заморачиваться с подсчётом времени, просто взял значения, при которых разница видна визуально) запускаем в консоли: Код: php 1. ждём меньше половины секунды Код: plsql 1. как по мне, дак целая вечность уже прошла То есть, арифметические операции в perl6 не так просты, и с числами что-то происходит и при этом что-то очень сложное. Как вариант - лишнее приведение типов (и как следствие округление), или же какие-то другие доп. действия. P.S. для чистоты эксперимента возможно стоило взять perl5 и perl6, но дело в том, что я perl не знаю вообще. А php всегда под рукой и принципы его работы мне более-менее ясны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 13:29 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Програмёр, в Perl6 короткие числа(до 64bit) с плавающей точкой хранятся как об'ект типа Rational - в виде пары чисел numerator/denominator (числитель/знаменатель), что позволяет не страдать от ошибок арифметики плавающей точки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:05 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661Програмёр, в Perl6 короткие числа(до 64bit) с плавающей точкой хранятся как об'ект типа Rational - в виде пары чисел numerator/denominator (числитель/знаменатель), что позволяет не страдать от ошибок арифметики плавающей точки. Я лучше буду "страдать" от того, что у меня 0.1+0.2!=0.3, чем от того, что скорость выполнения обычной арифметической операции падает в 20-30 раз. P.S. Спасибо разработчикам php за то, что 0.1+0.2 не равно 0.3 P.P.S. Я то могу повлиять на сравнение, просто округлив число там, где это необходимо. А вот ты на быстродействие perl6, думаю, никак повлиять не сможешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:34 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Код: php 1. 2. 3. 4. 5. Код: php 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:37 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
всего лишь в 200 раз? Код: php 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:51 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661 Код: php 1. 2. 3. 4. 5. Код: php 1. 2. 3. 4. 5. Если "++" - это операция инкремента (а скорее всего это так), то твой код делает совсем не то, что я написал :) Давай уж по честному... ты можешь написать код с тем же функционалом, что и у меня, только с нормальным быстродействием (ну, хотя бы те же 0.8 секунды)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:56 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Что у тебя там за машина такая, что за 12 секунд выполнила? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:57 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
что-то я неудачный запуск выложил на пыхе, вот: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:58 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
моя консольprogramer@newDebian:~$ time php -r '$sum=0; for($i=0; $i<1000000; $i++) {$sum+=$i;}' real 0m0.102s user 0m0.092s sys 0m0.008s programer@newDebian:~$ time perl6 -e 'my $sum; ++$sum for 1 .. 1_000_000' real 0m5.423s user 0m5.320s sys 0m0.108s programer@newDebian:~$ time perl6 -e 'my Rat $sum = 1.0; $sum++ for 1 .. 1_000_000' real 0m37.694s user 0m37.580s sys 0m0.164s programer@newDebian:~$ lscpu | grep -i mhz CPU MHz: 3108.164 programer@newDebian:~$ cat /proc/cpuinfo | grep 'model name' | uniq model name : Intel(R) Core(TM) i5-4690 CPU @ 3.50GHz Не впечатлило... у меня уж никак не 0.9 секунды php5 - 0.1s "оптимизированный" perl6 - 5.4s "не оптимизированный" perl6 - 37.7s ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:02 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
автор"оптимизированный" perl6 - 5.4s В каком месте он оптимизированный то? Там int а не float просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:10 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Hettавтор"оптимизированный" perl6 - 5.4s В каком месте он оптимизированный то? Там int а не float просто. пока ни в каком Просто очень хочу увидеть следующий вариант от volodin661 P.S. В моём примере тоже был int... И это не помешало ему выполняться 20 секунд. Тут всего лишь 5s видимо потому, что используется операция инкремента, а не суммы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:22 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Програмёр, задачи впечатлить чем-либо php-кодёра(или програмёра?) я перед собой не ставлю, моё сообщение было не о секундах, думать о которых не следует свысока , а о двух подходах: первый : человек обслуживает компилятор языка второй : компилятор обслуживает человека ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:24 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
лично я лишь хотел ответить на Ваш вопрос: volodin661почему я должен говорить спасибо за то, что 0.1 + 0.2 не равно 0.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:30 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
авторИ это не помешало ему выполняться 20 секунд. Где пример с 20 секундами? оО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:32 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
volodin661Програмёр, задачи впечатлить чем-либо php-кодёра(или програмёра?) я перед собой не ставлю, моё сообщение было не о секундах, думать о которых не следует свысока , а о двух подходах: первый : человек обслуживает компилятор языка второй : компилятор обслуживает человека и в обоих случаях человек остаётся недоволен ладно, пора завязывать, всё и так понятно. P.S. ещё попробовал потестить питон (делал это до появления цитируемого поста). Говорили, что на нём тот же трабл с арифметикой (все числа являются объектами). Не знаю так ли это, но вот результат: Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:34 |
|
||
|
Непонятка с плавающей точкой
|
|||
|---|---|---|---|
|
#18+
Hett, я не видел твоих сообщений выше, уж так получилось, и как ты ответил на мой вопрос про спасибо, кстати ? ( и не надо меня на Вы с большой буквы, переписка у нас пока неофицальная, расслабьтесь, ребята ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 15:35 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=39260403&tid=1461024]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 268ms |
| total: | 457ms |

| 0 / 0 |
