LINUX.ORG.RU
ФорумTalks

[php][история успеха][закопать]

 ,


0

2

Отлаживал тут один скрипт на php, наткнулся на эпичные грабли:

~$ php -r 'echo print_r(2732120973, true)."\n";'
2732120973
~$ # good
~$ php -r 'echo print_r(2732120973>0, true)."\n";'
1
~$ # fine
~$php -r 'echo print_r(2732120973 % 8, true)."\n";'
-3
~$ # FUUUUUUUU...

Они идиоты. Убейте их кто-нибудь. Пожалуйста.

Ответ на: комментарий от stevejobs

потому что люди некоторые люди не умеют включать мозг и читать документацию. В этом треде таких уже двое

nu11 ★★★★★
()
Ответ на: комментарий от nu11

мне можно, я в пыхе в отличие от вас не шарю. Вот открыл калькулятор и посчитал что то число по модулю 8 будет 5 =)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

А спелчекер в Ворде для вас тоже источник грамматической мудрости?

r_asian ★☆☆
()

Вывод: язык может вести себя неочевидно, если не читать документацию :)

SOmni ★★
()
Ответ на: комментарий от r_asian

echo print_r(2732120973 % 8, true).«\n»;
echo A, A=print_r(2732120973 % 8, true).«\n»;
echo A, B=C.D, C=print_r(2732120973 % 8, true), D=«\n»
... C=print_r(E), E=2732120973 % 8, true
... E=F,G , F = 2732120973 % 8, G = true
... F = H % I, H = 2732120973, I = 8

$a % $b Деление по модулю Целочисленный остаток от деления $a на $b.

2732120973 mod 8 = 5

ЧЯДНТ?

stevejobs ★★★★☆
()

Приветствую тебя, мой 32-битный друг

.

shimon ★★★★★
()
Ответ на: комментарий от stevejobs

For larger numbers (above PHP_INT_MAX), use fmod() rather than %. The other operators (+-*/) work correctly with floats and integer overflow, but % uses integer wrap. Eg.

<?php
var_dump(0xffffffff % 2);
//Prints  int(-1)   which is WRONG

var_dump(intval(fmod(0xffffffff,2)));
//Prints int(1)   which is the right answer
?>

(The reason this matters is that PHP's float is actually a double, and can accurately represent integers up to 52-bits, even on 32-bit systems)

Dolfer
()

Убейте их кто-нибудь

$ php -r 'echo intval(2732120973);'
-1562846323

Дальше можешь убить себя. Так как тебя ждёт немало тяжёлых для психики открытий в Python, Java, Perl, Си/Си++ и т.п.

KRoN73 ★★★★★
()
Ответ на: комментарий от r_asian

Он разделил одно число на другое. Числодробилка, без кластера не обойтись

vertexua ★★★★★
()
Ответ на: комментарий от geekless

>в документации сказано, что остаток от деления больших чисел отрицателен? Пруф можно? :-D

быдлокодеры совсем обленились, даже оглавление мана прочитать не осиливают.

То, что автор стреляет себе в ногу из дробовика, должно быть понятно любому нормальному кодеру. Даже если он не читал доку. Даже если он не знает пхп.

nu11 ★★★★★
()
$ emacsclient -e "most-positive-fixnum"
268435455

$ emacsclient -e "268435455"
268435455

$ emacsclient -e "268435456"
-268435456

Так и живем. :(

Zubok ★★★★★
()
Ответ на: комментарий от KRoN73

тяжёлых для психики открытий

Python

Ну ка, ну ка. Просим, просим.

Оговорюсь: ожидаются открытия, связанные с торчащими наружу кишками внутренней реализации интерпретатора.

baverman ★★★
()
Ответ на: комментарий от baverman

Python

Ну ка, ну ка. Просим, просим.

Ну, самое известное:

$ python
Python 2.7.1 (r271:86832, Jul  8 2011, 22:41:38) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1/3
0
KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А, да, прошу прощения, ещё совсем забыл про контекст. Если с таким же уровнем, как в сабже, начать в Питоне программировать, там можно на пробелах с табуляциями убиться :D

Опять же, много новичков будут стреляться на конструкциях, вида
", ".join(array)

В общем, Питон — весьма богатый на сюрпризы язык :)

KRoN73 ★★★★★
()
Ответ на: комментарий от baverman

А, вот ещё тоже известное вспомнилось:

>>> a = [1,2] 
>>> b = [a,a] 
>>> b
[[1, 2], [1, 2]]
>>> a.append(3) 
>>> b
[[1, 2, 3], [1, 2, 3]]

Попробуй это переварить без документации :D

KRoN73 ★★★★★
()
Ответ на: комментарий от kernelpanic

>Да тут и переваривать нечего. Все просто и понятно.

Как и на PHP :)

KRoN73 ★★★★★
()
Ответ на: комментарий от kernelpanic

ну это смотря с чего начинать, добавление элементов по ссылке или копированием по значению в разных языках происходит по разному, что кому что привычно с для таких вещей (как и для арифметики читать документацию крайне полезно в любом случае)

qnikst ★★★★★
()
Ответ на: комментарий от KRoN73

Целочисленное деление, join, а тем более непонятно, какого результата ты ожидал от append.

А где, собсна, кишки? Всё это разжевывается в туторе.

baverman ★★★
()
Ответ на: комментарий от KRoN73

> Попробуй это переварить без документации :D

А что тут переваривать? Обычное поведение reference type.

tailgunner ★★★★★
()
Ответ на: комментарий от qnikst

хотя неожиданный переход на gmp

Со стороны это выглядит гладенько. И уж точно лучше переполнения.

baverman ★★★
()
Ответ на: комментарий от KRoN73

> intval(2732120973) == -1562846323

Дальше можешь убить себя. Так как тебя ждёт немало тяжёлых для психики открытий в Python, Java, Perl, Си/Си++ и т.п.

Ололо, показываешь знатный WTFчик и предлагаешь мне убить себя? Малость ошибся — я не разработчик PHP.

ждёт немало тяжёлых для психики открытий в Python, Java, Perl, Си/Си++ и т.п.

Ну давай, порази меня. :D

KRoN73, ты ж вроде вменяемый человек. Но php задело за живое, да? Баттхерт прохватил?

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> print 1/3

0


KRoN73, познакомься, это целочисленное деление. Целочисленное деление, это KRoN73.
Теперь вы друзья, имейте приятный день.

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> Если с таким же уровнем, как в сабже, начать в Питоне программировать, там можно на пробелах с табуляциями убиться :D

Сказал «специалист», которого ставит в тупик целочисленное деление.

Опять же, много новичков будут стреляться на конструкциях, вида

", ".join(array)



И что тут непонятного? Для вас и вызов метода — чёрная магия, не только деление?

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> Попробуй это переварить без документации :D

А здесь вообще нет ничего странного и непонятного.

geekless ★★
() автор топика
Ответ на: комментарий от nu11

быдлокодеры совсем обленились, даже оглавление мана прочитать не осиливают.
То, что автор стреляет себе в ногу из дробовика, должно быть понятно любому нормальному кодеру. Даже если он не читал доку. Даже если он не знает пхп.

Лол, пока пхпшники усиленно придумывают отправдание всем багам дизайна пхп, которые после соответствующего документирования стали называться фичами, в ruby тихо и спокойно работает целочисленная арифметика для чисел произвольной разрядности.

irb(main):001:0> a = 123456789 * 987654321
=> 121932631112635269
irb(main):002:0> puts (a - (a / 20) * 20  == a % 20) ? "ruby is fine" : "ruby sucks"
ruby is fine
=> nil

Кстати, как там, PHP уже научился применять операцию [] к результату, возвращаемому функцией? :D

~$ php -r 'echo array(0)[0];'
PHP Parse error:  syntax error, unexpected '[', expecting ',' or ';' in Command line code on line 1

Конечно, нет.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>придумывают отправдание всем багам дизайна пхп
с каких пор особенности машинной арифметики стали багом дизайна языка?

ruby тихо и спокойно работает целочисленная арифметика для чисел произвольной разрядности.

пхп тоже, через соответствующие модули.

PHP уже научился применять операцию [] к результату, возвращаемому функцией?

в 5.4 есть. А что, это прям киллер-фича руби? Больше гордиться нечем? :)

nu11 ★★★★★
()
Ответ на: комментарий от nu11

> с каких пор особенности машинной арифметики стали багом дизайна языка?

С каких пор баги дизайна языка стали оправдывать ссылками на особенности машинной арифметики?

в 5.4 есть.

Не прошло и 20-ти лет. Это позор. Разработчикам бы следовало провалиться сквозь землю со стыда. За одно оказали бы этим одолжение всему человечеству.

А что, это прям киллер-фича руби? Больше гордиться нечем? :)

Первый класс, вторая четверть. ЛОР не торт.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>KRoN73, познакомься, это целочисленное деление.

Удивись, но я с ним знаком около 23-х лет. Я хоть где-то там выше про себя писал?

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

>Кстати, как там, PHP уже научился применять операцию [] к результату, возвращаемому функцией? :D

Это всё, что тебе нужно от языка? У меня для тебя плохие новости, у многих языков операции [] вообще нету :)

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

>С каких пор баги дизайна языка стали оправдывать ссылками на особенности машинной арифметики?
так в чем баг языка-то? В том, что он позволяет идиотам отстрелить себе конечность? Тогда у меня для тебя плохие новости

Не прошло и 20-ти лет. Это позор.

это толсто

nu11 ★★★★★
()
Ответ на: комментарий от KRoN73

> Удивись, но я с ним знаком около 23-х лет. Я хоть где-то там выше про себя писал?

Ты выбрал это в качестве демонстрации «проблемы языка». Ты, не кто-то другой.

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> Это всё, что тебе нужно от языка? У меня для тебя плохие новости, у многих языков операции [] вообще нету :)

Если хочешь потроллить, придумай что-нибудь повеселее. Уныло же. На самом деле.

geekless ★★
() автор топика
Ответ на: комментарий от nu11

> так в чем баг языка-то? В том, что он позволяет идиотам отстрелить себе конечность? Тогда у меня для тебя плохие новости

Пыхеры такие забавные, так яростно защищают свою любимые, лелеемые, изученные до каждой выщерблинки костыли, в то время как весь остальной мир ходит на здоровых, нормальных ногах.

Да, intval(2732120973) == -1562846323 — это нелепый и тупой баг дизайна языка. Если ты этого не в состоянии осознать, плохие новости как раз для тебя.

geekless ★★
() автор топика
Ответ на: комментарий от baverman

В том что целые только 32битные (какие они, кстати на x64?) и на это никак нельзя повлиять.

Еще и в том, что 2732120973, «целое» по записи, — на самом деле является float на 32-битной машине. Эталонный WTF-чик.

И в том, что приведение float к integer — по сути содержит в себе фееричненькое UB, которое не генерирует, цитирую, «ни предупреждения, ни даже замечания».

Если число с плавающей точкой превышает размеры integer (обычно +/- 2.15e+9 = 2^31 на 32-битных системах и +/- 9.22e+18 = 2^63 на 64-битных системах), результат будет неопределенным, так как float не имеет достаточной точности, чтобы вернуть верный результат. В этом случае не будет выведено ни предупреждения, ни даже замечания!

FAIL

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>Ты выбрал это в качестве демонстрации «проблемы языка»

Нет, я выбрал это в качестве демонстрации неочевидности для людей, незнакомых с языком. Точно также, как и случай сабжа.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Нет, я выбрал это в качестве демонстрации неочевидности для людей, незнакомых с языком. Точно также, как и случай сабжа.

Любой, кто учился в школе, знаком с целыми числами и целочисленным делением. Давай другой пример, настоящей, а не вымышленной неочевидности.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>Пыхеры такие забавные
я пыхер весьма условный. Я активно пишу на 4х языках, еще штук 5 периодически использую для нужных задач.

это нелепый и тупой баг дизайна языка.

т.е. по-твоему Си бажный by design? :)

nu11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.