PHPã§==ã®ä»£ããã«strcmpé¢æ°ã使ããã¨ã«ããåé¡ç¹
è£è¶³(2010/12/01 03:00)ï¼floatããstringã¸ã®ãã£ã¹ãã§ä¸¸ããããæ¡æ°ã«ã¤ãã¦ã§ãããphp.iniã®è¨å®å¤ãprecisionãã®å½±é¿ãåããããã§ãã
åã¯ä»¥åãããPHPã®==ã¯ãã¢ããã===ã使ããããã¨è¨ã£ã¦ããã¤ããã§ãï¼åèï¼ãPHPの==がキモい件ãï¼ããããããããä¸ã«ã¯==ã使ã£ãæ¯è¼ã§ã®ä¸æ ®ã®äºæ ãé²ãç®çã§ããå®å ¨ãª==ãã¨ãã¦strcmpé¢æ°ã使ã£ã¦æ¯è¼ãã¦ãã人ãå± ãããã§ãããã®ããæ¹ã«ã¤ãã¦åé¡ç¹ãææãã¾ãã
strcmpã§æ¯è¼ããã¨ããã®ã¯stringåã«ãã£ã¹ãããã¦æ¯è¼ããã®ã¨åãã§ãããããã£ã¹ããã¦ä½ãèµ·ãããçç¥ãã¦ããªãã¨æ¯è¼çµæã¯æ³åãã¤ãã¾ãããåã¯å ¨ã¦ã®åããstringåã¸ã®ãã£ã¹ãã§ä½ãèµ·ãããã¹ã©ã¹ã©è¨ããããã§ã¯ããã¾ãããããä½ã§ãstrcmpããã®ã¯==ã使ãã®ã¨åãããã«æãã¨æãã¾ãã
ä»åãstrcmpã==ã®ä»£ããã«ä½¿ãã¨åé¡ãèµ·ããã¨æãããä¾ãä½åãè¦ã¤ãã¾ããã®ã§ãããã«ã¤ãã¦ã¾ã¨ãã¦ã¿ã¾ããçµè«ã¨ãã¦ã¯ãã¯ã===æ¼ç®åã使ããããã£ã¦ãã¨ã§ãã
æå¹æ¡æ°ã10é²ã§15æ¡ä»¥ä¸ããæµ®åå°æ°ç¹æ°
$ php -r 'var_dump(pow(2,52)==pow(2,52)+10);' bool(false) $ php -r 'var_dump(strcmp(pow(2,52),pow(2,52)+10));' int(0)
2ã®52ä¹ã¨ãããã«10å ããæ°ãæ¯è¼ãã¦ãã¾ãã==ã¯ä¸¡è ãç°ãªããã®ã¨ãã¦èªèãã¾ãããstrcmpã¯åãã ã¨å¤æãã¦ãã¾ãã
floatåããstringåã¸ãã£ã¹ãããã¨ã10é²ã§æå¹æ¡æ°14æ¡ã¾ã§ã®è¡¨ç¾ã«ãªãã¾ããã¤ã¾ãã15æ¡ããå
ã®ç²¾åº¦ã¯å¤±ã£ã¦ãã¾ããã¨ã«ãªãã¾ããæµ®åå°æ°ç¹æ°ã®ç²¾åº¦ã¯53bitã10é²ã§è¨ãã°15.9æ¡ã»ã©ã§ãããã10é²ã§2æ¡è¿ãæ
å ±ã失ã£ã¦ãã¾ãããã§ãã
æµ®åå°æ°ç¹æ°ã¨æ´æ°
PHP5.2.2ã5.2.6ã§ã¯ãããã»ã©å¤§ãããªãæµ®åå°æ°ç¹æ°ãæååã«ç´ããéã«ããã¾ã«ææ°è¡¨è¨ã«ãªãããã§ãï¼åèï¼ãPHPの浮動小数点数の表示ãï¼ããããå¿ç¨ãã¦ãé常ã«å¥å¦ãªæåãè¦ã¤ãã¾ããã
$ php-5.2.6 -r 'var_dump(strcmp(1100000,1100000.0));' int(0) $ php-5.2.6 -r 'var_dump(strcmp(1200000,1200000.0));' int(4) $ php-5.2.6 -r 'var_dump(strcmp(1300000,1300000.0));' int(0) $ php-5.2.6 -r 'var_dump(strcmp(1400000,1400000.0));' int(6)
strcmpã§æ¯è¼ããã¨ã110ä¸ã¨130ä¸ã¯æ´æ°ãæµ®åå°æ°ç¹æ°ãåãã ãã©ã120ä¸ã¨140ä¸ã¯éããã¨ããçµæã«ãªãã¾ããããã¢ãã§ããã
-0.0
æµ®åå°æ°ç¹æ°ã¯ããã©ã¹ãã0.0ã«è¿ä»ããå ´åã¨ãã¤ãã¹ãã0.0ã«è¿ä»ããå ´åãåºå¥ãããããè¨ç®çµæã0.0ã§ã符å·ãã¤ãã¾ããPHP5.2.3ããã¯ããã®-0.0ãstringåã«ãã£ã¹ãããã¨"-0"ã«ãªãããã«ãªãã¾ããã-0.0ãæ°ã¨ãã¦ã¯0.0ã¨åããªã®ã§ã==ã===ã§æ¯è¼ããã¨åãæ°ã«ãªãã¾ãããstrcmpã§æ¯è¼ããã¨ç°ãªãæååã¨ãã¦æ±ããã¦ãã¾ãã¾ãã
$ php -r 'var_dump(-1/1e1000);' float(-0) $ php -r 'var_dump(-1/1e1000==0.0);' bool(true) $ php -r 'var_dump(-1/1e1000===0.0);' bool(true) $ php -r 'var_dump(strcmp(-1/1e1000,0.0));' int(-3)
strcmpã«ããã°ã-0.0ã¨0.0ã¨ã¯å¥ç©ã¨ãããã¨ã«ãªãã¾ãã===ã§æ¯è¼ãã¦åãæ°ãªãã®ãéãã¨å¤æãã¦ãã¾ãããã§ããããæ°å¤ã®æ¯è¼ã¨ãã¦èããã¨ããããªæåãªã®ã§ã¯ãªãã§ããããã
âã¨-âã¨NaN
æµ®åå°æ°ç¹æ°ã§ã¯âã-âã表ç¾ã§ãã¾ãããããstringåã«ãã£ã¹ãããã¨"INF"ã"-INF"ã¨ãªãã¾ãã
$ php -r 'var_dump(1e1000);' float(INF) $ php -r 'var_dump(1e1000=="INF");' bool(false) $ php -r 'var_dump(strcmp(1e1000,"INF"));' int(0)
âã==æ¼ç®åã§æ¯è¼ããå ´åã¯å
¨ã¦ã®æååã¨ç°ãªããã®ã¨ãã¦å¤æãã¾ãããstrcmpé¢æ°ã§æ¯è¼ããã¨"INF"3æåã¨åãã«ãªã£ã¦ãã¾ãã¾ãã大ããåé¡ã«ã¯ãªããªãã¨æãã¾ããããã¢ãã§ããã
NaN(Not a Number)ã«ã¤ãã¦ãåæ§ã§ãã
arrayå
ããã¥ã¢ã«ã«ãæ¸ãã¦ãããã§ãããarrayãstringåã«ãã£ã¹ãããã¨å
¨ã¦"Array"ã«ãªãã¾ããã¤ã¾ããã©ããªä¸èº«ã®arrayã§ãstrcmpã§æ¯è¼ããã¨åãã¨ãããã¨ã«ãªãã¾ãã
çµè«
==ã®ä»£ããã«strcmpé¢æ°ã§æ¯è¼ããã¨ãfloatåã¨arrayåãæ±ãå ´åã«==ã使ãã®ã¨ã¯å¥ã®åé¡ãçºçãããã¨ã示ãã¾ããã
ãããªåãæ¥ããªãstrcmp使ããªãããã¨ããæè¦ãããã¨ã¯æãã¾ãããæ¥ãåãããã£ã¦ãããªã===ã使ãã°ããã¨æããã§ããããstrcmpã使ãããç¶æ³ãåã«ã¯ãããã¾ãããä½ã«ããããå®å ¨ãª==ãã¨ãã¦ä½¿ãã«ã¯stringåã¸ã®ãã£ã¹ããçç¥ãã¦ããå¿ è¦ãããã¨æãã¾ãããã¨ããã®ãæ¬è¨äºã®ä¸»å¼µã§ããstrcmpã¯æååå士ã®å¤§å°æ¯è¼ã«ãã使ããªãã¨åã¯æãã¾ãã
念ã®ããè£è¶³ãã¦ããã¨ãPHPãåæã«å¤æ°ã®åãå¤ãããã¨ã¯ããã¾ãããæ¼ç®åãé¢æ°ãå¿ è¦ã«å¿ãã¦ãã£ã¹ããããã¨ã¯ããã¾ãããå¼ã³åºãå ã®å¤æ°ã®åãåæã«æ¸ãå¤ããããã§ã¯ããã¾ãããæ示çã«ä»£å ¥ããå ´åã«ããå¤æ°ã®åãå¤ãããã¨ã¯ããã¾ããã®ã§ãèªåã®æ¸ããããã°ã©ã ã§å¤æ°ã®åãäºæ¸¬ã§ããªãç¶æ³ã¨ããã®ã¯æãå¾ãªãã¨æãã¾ãã