国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 建站經(jīng)驗(yàn) > 正文

PHP浮點(diǎn)、數(shù)知識(shí)

2019-11-02 14:49:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

   這篇文章主要介紹了你應(yīng)該知道PHP浮點(diǎn)數(shù)知識(shí),本文講解了PHP浮點(diǎn)數(shù)、PHP數(shù)字的臨界值,精度損失等問(wèn)題,需要的朋友可以參考下

  PHP是一種弱類(lèi)型語(yǔ)言, 這樣的特性, 必然要求有無(wú)縫透明的隱式類(lèi)型轉(zhuǎn)換, PHP內(nèi)部使用zval來(lái)保存任意類(lèi)型的數(shù)值, zval的結(jié)構(gòu)如下(5.2為例):

   代碼如下:

  struct _zval_struct {

  /* Variable information */

  zvalue_value value; /* value */

  zend_uint refcount;

  zend_uchar type; /* active type */

  zend_uchar is_ref;

  };

  上面的結(jié)構(gòu)中, 實(shí)際保存數(shù)值本身的是zvalue_value聯(lián)合體:

   代碼如下:

  typedef union _zvalue_value {

  long lval; /* long value */

  double dval; /* double value */

  struct {

  char *val;

  int len;

  } str;

  HashTable *ht; /* hash table value */

  zend_object_value obj;

  } zvalue_value;

  今天的話(huà)題, 我們只關(guān)注其中的倆個(gè)成員, lval和dval, 我們要意識(shí)到, long lval是隨著編譯器, OS的字長(zhǎng)不同而不定長(zhǎng)的, 它有可能是32bits或者64bits, 而double dval(雙精度)由IEEE 754規(guī)定, 是定長(zhǎng)的, 一定是64bits.

  請(qǐng)記住這一點(diǎn), 造就了PHP的一些代碼的”非平臺(tái)無(wú)關(guān)性”. 我們接下來(lái)的討論, 除了特別指明, 都是假設(shè)long為64bits

  IEEE 754的浮點(diǎn)計(jì)數(shù)法, 我這里就不引用了, 大家有興趣的可以自己查看, 關(guān)鍵的一點(diǎn)是, double的尾數(shù)采用52位bit來(lái)保存, 算上隱藏的1位有效位, 一共是53bits.

  在這里, 引出一個(gè)很有意思的問(wèn)題, 我們用c代碼舉例(假設(shè)long為64bits):

   代碼如下:

  long a = x;

  asser

2tu迅播影院[www.aikan.tv/special/2tuxunboyingyuan/]
t(a == (long)(double)a);

  請(qǐng)問(wèn), a的取值在什么范圍內(nèi)的時(shí)候, 上面的代碼可以斷言成功?(留在文章最后解答)

  現(xiàn)在我們回歸正題, PHP在執(zhí)行一個(gè)腳本之前, 首先需要讀入腳本, 分析腳本, 這個(gè)過(guò)程中也包含著, 對(duì)腳本中的字面量進(jìn)行zval化, 比如對(duì)于如下腳本:

   代碼如下:

  

  $a = 9223372036854775807; //64位有符號(hào)數(shù)最大值

  $b = 9223372036854775808; //最大值+1

  var_dump($a);

  var_dump($b);

  輸出:

   代碼如下:

  int(9223372036854775807)

  float(9.22337203685E+18)

  也就說(shuō), PHP在詞法分析階段, 對(duì)于一個(gè)字面量的數(shù)值, 會(huì)去判斷, 是否超出了當(dāng)前系統(tǒng)的long的表值范圍, 如果不是, 則用lval來(lái)保存, zval為IS_LONG, 否則就用dval表示, zval IS_FLOAT.

  凡是大于最大的整數(shù)值的數(shù)值, 我們都要小心, 因?yàn)樗赡軙?huì)有精度損失:

   代碼如下:

  

  $a = 9223372036854775807;

  $b = 9223372036854775808;

  var_dump($a === ($b - 1));

  輸出是false.

  現(xiàn)在接上開(kāi)頭的討論, 之前說(shuō)過(guò), PHP的整數(shù), 可能是32位, 也可能是64位, 那么就決定了, 一些在64位上可以運(yùn)行正常的代碼, 可能會(huì)因?yàn)殡[形的類(lèi)型轉(zhuǎn)換, 發(fā)生精度丟失, 從而造成代碼不能正常的運(yùn)行在32位系統(tǒng)上.

  所以, 我們一定要警惕這個(gè)臨界值, 好在PHP中已經(jīng)定義了這個(gè)臨界值:

   代碼如下:

  

  echo PHP_INT_MAX;

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 马公市| 婺源县| 牡丹江市| 乌海市| 许昌县| 平山县| 青海省| 罗定市| 景德镇市| 永城市| 台湾省| 含山县| 洛川县| 墨江| 葵青区| 昌都县| 民县| 德清县| 额尔古纳市| 湛江市| 锦州市| 高要市| 台湾省| 嵊州市| 杨浦区| 大悟县| 苍溪县| 囊谦县| 育儿| 苏尼特右旗| 班戈县| 尉氏县| 黑水县| 拉孜县| 通化县| 正安县| 浏阳市| 壶关县| 株洲县| 长岭县| 凤山市|