Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Непонятка с плавающей точкой / 25 сообщений из 38, страница 1 из 2
14.06.2016, 23:56
    #39256027
cylbps
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Ребята, растолкуйте что к чему нужно привести, что бы ноль получился:
Код: php
1.
2.
3.
4.
<?php
$val = 7.300 - (73.000 * 0.100);
echo $val;
?>


дает такой результат -8.8817841970013E-16
...
Рейтинг: 0 / 0
15.06.2016, 00:17
    #39256030
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
http://php.net/manual/ru/language.types.float.php Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции. Там же и методика обработки подобных случаев описана.
...
Рейтинг: 0 / 0
15.06.2016, 00:36
    #39256033
cylbps
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
vkle http://php.net/manual/ru/language.types.float.php Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции. Там же и методика обработки подобных случаев описана.
Спасибо!
...
Рейтинг: 0 / 0
16.06.2016, 14:10
    #39257124
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
cylbps,
а за что спасибо-то?




мне никогда не было понятно,
почему я должен говорить спасибо
за то, что 0.1 + 0.2 не равно 0.3
...
Рейтинг: 0 / 0
17.06.2016, 16:39
    #39258006
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
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)
...
Рейтинг: 0 / 0
19.06.2016, 12:50
    #39258434
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Програмёрприми как факт


Код: php
1.
perl6 -e 'say 0.1 + 0.2 == 0.3'


True

Два мира - два Шапиро
...
Рейтинг: 0 / 0
21.06.2016, 03:30
    #39259269
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
volodin661Програмёрприми как факт


Код: php
1.
perl6 -e 'say 0.1 + 0.2 == 0.3'


True

Два мира - два Шапиро

Код: php
1.
programer@newDebian:~$ php -r 'echo ((string)(0.1+0.2)===(string)0.3);'


Результат: 1 (то есть true)

P.S. Как думаешь, почему?
...
Рейтинг: 0 / 0
22.06.2016, 04:45
    #39260057
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Програмёр,

тебе не заметна разница в написании ?
Код: sql
1.
0.1 + 0.2 == 0.3


и

Код: sql
1.
((string)(0.1+0.2)===(string)0.3)



ПрограмёрРезультат: 1 (то есть true)

а что 1 есть true - это, стало быть, ты мне пояснил ?
...
Рейтинг: 0 / 0
22.06.2016, 12:14
    #39260262
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
В python, java, php
выражение 0.1 + 0.2 == 0.3 ложное, что там происходит в питоне лично я не знаю, может кто-то пояснит.
...
Рейтинг: 0 / 0
22.06.2016, 13:29
    #39260338
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
volodin661Програмёр,

тебе не заметна разница в написании ?
Код: sql
1.
0.1 + 0.2 == 0.3


и

Код: sql
1.
((string)(0.1+0.2)===(string)0.3)



ПрограмёрРезультат: 1 (то есть true)

а что 1 есть true - это, стало быть, ты мне пояснил ?

Итак... посидел, поэкспериментировал, что бы увериться, что я прав.
На пятом перле "print 0.1+0.2==0.3" молчит (то есть выражение ложно)
на шестом перле "print 0.1+0.2==0.3" выводит True

Отсюда вывод, что на шестом перле числа проходят некоторое преобразование, которое не проходили в perl5

проверяем теорию тестом (не стал заморачиваться с подсчётом времени, просто взял значения, при которых разница видна визуально)
запускаем в консоли:
Код: php
1.
php -r '$sum=0; for($i=0; $i<1000000; $i++) {$sum+=$i;}'


ждём меньше половины секунды
Код: plsql
1.
perl6 -e 'my $sum=0; loop (my $i=0; $i < 1000000; $i++) {$sum+=$i;}'


как по мне, дак целая вечность уже прошла

То есть, арифметические операции в perl6 не так просты, и с числами что-то происходит и при этом что-то очень сложное. Как вариант - лишнее приведение типов (и как следствие округление), или же какие-то другие доп. действия.

P.S. для чистоты эксперимента возможно стоило взять perl5 и perl6, но дело в том, что я perl не знаю вообще. А php всегда под рукой и принципы его работы мне более-менее ясны.
...
Рейтинг: 0 / 0
22.06.2016, 14:05
    #39260376
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Програмёр,

в Perl6 короткие числа(до 64bit) с плавающей точкой хранятся как об'ект типа Rational -
в виде пары чисел numerator/denominator (числитель/знаменатель),
что позволяет не страдать от ошибок арифметики плавающей точки.
...
Рейтинг: 0 / 0
22.06.2016, 14:34
    #39260390
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
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, думаю, никак повлиять не сможешь.
...
Рейтинг: 0 / 0
22.06.2016, 14:37
    #39260394
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Код: php
1.
2.
3.
4.
5.
time perl6 -e 'my $sum; ++$sum for 1 .. 1_000_000'

real	0m0.783s
user	0m0.752s
sys	0m0.029s



Код: php
1.
2.
3.
4.
5.
time perl6 -e 'my Rat $sum = 1.0; $sum++ for 1 .. 1_000_000'

real	0m12.289s
user	0m11.752s
sys	0m0.503s
...
Рейтинг: 0 / 0
22.06.2016, 14:51
    #39260403
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
всего лишь в 200 раз?

Код: php
1.
2.
3.
4.
5.
time php -r '$sum = 1.0; for($i = 0; $i < 1000000; $i++) $sum++;'

real    0m0.063s
user    0m0.047s
sys     0m0.012s
...
Рейтинг: 0 / 0
22.06.2016, 14:56
    #39260408
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
volodin661
Код: php
1.
2.
3.
4.
5.
time perl6 -e 'my $sum; ++$sum for 1 .. 1_000_000'

real	0m0.783s
user	0m0.752s
sys	0m0.029s



Код: php
1.
2.
3.
4.
5.
time perl6 -e 'my Rat $sum = 1.0; $sum++ for 1 .. 1_000_000'

real	0m12.289s
user	0m11.752s
sys	0m0.503s



Если "++" - это операция инкремента (а скорее всего это так), то твой код делает совсем не то, что я написал :)

Давай уж по честному... ты можешь написать код с тем же функционалом, что и у меня, только с нормальным быстродействием (ну, хотя бы те же 0.8 секунды)?
...
Рейтинг: 0 / 0
22.06.2016, 14:57
    #39260409
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Что у тебя там за машина такая, что за 12 секунд выполнила?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
root@dev-01 ~ # time perl6 -e 'my Rat $sum = 1.0; $sum++ for 1 .. 1_000_000'

real    1m0.994s
user    0m59.529s
sys     0m1.311s
root@dev-01 ~ # time php -r '$sum = 1.0; for($i = 0; $i < 1000000; $i++) $sum++;'

real    0m0.472s
user    0m0.052s
sys     0m0.024s
...
Рейтинг: 0 / 0
22.06.2016, 14:58
    #39260412
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
что-то я неудачный запуск выложил на пыхе, вот:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
root@dev-01 ~ # time php -r '$sum = 1.0; for($i = 0; $i < 1000000; $i++) $sum++;'

real    0m0.043s
user    0m0.039s
sys     0m0.004s
root@dev-01 ~ # time php -r '$sum = 1.0; for($i = 0; $i < 1000000; $i++) $sum++;'

real    0m0.052s
user    0m0.052s
sys     0m0.000s
root@dev-01 ~ # time php -r '$sum = 1.0; for($i = 0; $i < 1000000; $i++) $sum++;'

real    0m0.052s
user    0m0.036s
sys     0m0.016s
...
Рейтинг: 0 / 0
22.06.2016, 15:02
    #39260416
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
моя консоль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
...
Рейтинг: 0 / 0
22.06.2016, 15:10
    #39260421
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
автор"оптимизированный" perl6 - 5.4s
В каком месте он оптимизированный то? Там int а не float просто.
...
Рейтинг: 0 / 0
22.06.2016, 15:22
    #39260436
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Hettавтор"оптимизированный" perl6 - 5.4s
В каком месте он оптимизированный то? Там int а не float просто.

пока ни в каком Просто очень хочу увидеть следующий вариант от volodin661

P.S. В моём примере тоже был int... И это не помешало ему выполняться 20 секунд. Тут всего лишь 5s видимо потому, что используется операция инкремента, а не суммы
...
Рейтинг: 0 / 0
22.06.2016, 15:24
    #39260439
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Програмёр,

задачи впечатлить чем-либо php-кодёра(или програмёра?) я перед собой не ставлю,
моё сообщение было не о секундах, думать о которых не следует свысока ,
а о двух подходах:

первый : человек обслуживает компилятор языка
второй : компилятор обслуживает человека
...
Рейтинг: 0 / 0
22.06.2016, 15:30
    #39260450
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
лично я лишь хотел ответить на Ваш вопрос:

volodin661почему я должен говорить спасибо
за то, что 0.1 + 0.2 не равно 0.3
...
Рейтинг: 0 / 0
22.06.2016, 15:32
    #39260456
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
авторИ это не помешало ему выполняться 20 секунд.
Где пример с 20 секундами? оО
...
Рейтинг: 0 / 0
22.06.2016, 15:34
    #39260460
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
volodin661Програмёр,

задачи впечатлить чем-либо php-кодёра(или програмёра?) я перед собой не ставлю,
моё сообщение было не о секундах, думать о которых не следует свысока ,
а о двух подходах:

первый : человек обслуживает компилятор языка
второй : компилятор обслуживает человека

и в обоих случаях человек остаётся недоволен

ладно, пора завязывать, всё и так понятно.

P.S. ещё попробовал потестить питон (делал это до появления цитируемого поста). Говорили, что на нём тот же трабл с арифметикой (все числа являются объектами). Не знаю так ли это, но вот результат:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
programer@newDebian:~$ cat test.py
a=0
for x in range(1,1000000):
    a+=x
print a

programer@newDebian:~$ time python2.7 test.py
499999500000

real	0m0.079s
user	0m0.068s
sys	0m0.008s
...
Рейтинг: 0 / 0
22.06.2016, 15:35
    #39260464
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с плавающей точкой
Hett,

я не видел твоих сообщений выше, уж так получилось,
и как ты ответил на мой вопрос про спасибо, кстати ?



( и не надо меня на Вы с большой буквы,
переписка у нас пока неофицальная, расслабьтесь, ребята )
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Непонятка с плавающей точкой / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]