日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 常量折叠_V8 使用“常量折叠”优化技巧,导致幂(**)运算有时候不等于 Math.pow()...

發(fā)布時(shí)間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 常量折叠_V8 使用“常量折叠”优化技巧,导致幂(**)运算有时候不等于 Math.pow()... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在如今的主流 Web 編程語(yǔ)言中,如 PHP 或 Python 等,都包含冪運(yùn)算符(一般來(lái)說(shuō)符號(hào)是 ^ 或者 **)。而最新的 ES7 中也增加了對(duì)冪運(yùn)算的支持,使用符號(hào) **,最新的 Chrome 已經(jīng)提供了對(duì)冪運(yùn)算的支持。

但是在 javascript 中,** 運(yùn)算有時(shí)候并不等于 Math.pow(a,b),在最新的 Chrome 55 中:

Math.pow(99,99) 的結(jié)果是 3.697296376497263e+197,

但是 99**99 的結(jié)果是 3.697296376497268e+197。

兩者并不相等

3.697296376497263e+197

3.697296376497268e+197

而且 Math.pow(99,99) - 99**99 的結(jié)果也不是 0 而是 -5.311379928167671e+182。

因此我們猜測(cè),** 操作符只是冪運(yùn)算的另一個(gè)實(shí)現(xiàn)。但是當(dāng)我們寫一個(gè)函數(shù)時(shí),冪運(yùn)算又表現(xiàn)出詭異的特性:

function diff(x) {

return Math.pow(x,x) - x**x;

}

調(diào)用 diff(99) 返回 0。WTF?兩者又相等了!

猜猜下面代碼輸出什么?

var x = 99;

x**x - 99**99;

這段代碼的運(yùn)行結(jié)果是 -5.311379928167671e+182。

這簡(jiǎn)直是薛定諤的冪。

究其原因,V8 引擎使用了常量折疊(const folding)。常量折疊是一種編譯器的編譯優(yōu)化技術(shù)。

考慮如下代碼:

for (let i = 0; i < 100*100*100; i++){

// 循環(huán)體

}

該循環(huán)的條件 i<100*100*100 是一個(gè)表達(dá)式(expression),如果放到判斷時(shí)再求值那么 100*100*100 的計(jì)算將會(huì)進(jìn)行 1000000 次。如果編譯器在語(yǔ)法分析階段進(jìn)行常量合并,該循環(huán)將會(huì)變?yōu)檫@樣:

for (let i = 0; i < 1000000; i++){

// 循環(huán)體

}

而上文中提到的 99**99 的計(jì)算也使用到了常量折疊。也就是說(shuō) 99**99 是在編譯時(shí)進(jìn)行計(jì)算(常量折疊),而 Math.pow 總是在運(yùn)行時(shí)進(jìn)行計(jì)算。當(dāng)我們使用變量進(jìn)行冪運(yùn)算時(shí)(例 a**b)此時(shí)不存在常量折疊,因此 a ** b 的值在運(yùn)行時(shí)進(jìn)行計(jì)算,** 會(huì)被編譯成 Math.pow 調(diào)用。

在源碼 src/parsing/parser.cc 文件中,編譯時(shí)計(jì)算代碼:

case Token::EXP: {

double value = Pow(x_val, y_val);

int int_value = static_cast(value);

*x = factory()->NewNumberLiteral(

int_value == value && value != -0.0 ? int_value : value, pos,

has_dot);

return true;

可以看到使用了 Pow 函數(shù)計(jì)算了冪運(yùn)算的求值結(jié)果。Pow 是一個(gè) inline 的函數(shù),內(nèi)部做了一些常規(guī)優(yōu)化,對(duì)不能優(yōu)化的情況則使用了 std::pow(x, y) 來(lái)計(jì)算最終結(jié)果。

而 Math.pow 的算法為:

// ES6 section 20.2.2.26 Math.pow ( x, y )

TF_BUILTIN(MathPow, CodeStubAssembler) {

Node* x = Parameter(1);

Node* y = Parameter(2);

Node* context = Parameter(5);

Node* x_value = TruncateTaggedToFloat64(context, x);

Node* y_value = TruncateTaggedToFloat64(context, y);

Node* value = Float64Pow(x_value, y_value);

Node* result = ChangeFloat64ToTagged(value);

Return(result);

}

可見(jiàn)兩者使用了不同的算法。但是當(dāng)不做常量折疊的時(shí)候,** 則轉(zhuǎn)換成了 Math.pow 函數(shù)調(diào)用:

Expression* Parser::RewriteExponentiation(

Expression* left,

Expression* right,

int pos) {

ZoneList* args = new (zone()) ZoneList(2, zone());

args->Add(left, zone());

args->Add(right, zone());

return factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos);

}

于是就造成了 ** 有時(shí)不等于 Math.pow 的怪異問(wèn)題。再看看如下代碼:

console.log(99**99);

a = 99, b = 99;

console.log(a**b);

console.log(Math.pow(99, 99));

分別輸出:

3.697296376497268e+197

3.697296376497263e+197

3.697296376497263e+197

其實(shí)

9999=369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899

因此第一個(gè)結(jié)果更接近準(zhǔn)確的值。

上周(2017年1月16日)這個(gè)怪異的行為已經(jīng)作為一個(gè) bug 提交給了 V8 項(xiàng)目,bug 編號(hào) #5848。

總結(jié)

以上是生活随笔為你收集整理的java 常量折叠_V8 使用“常量折叠”优化技巧,导致幂(**)运算有时候不等于 Math.pow()...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人综合色 | 一区二区高清 | 男人天堂av在线播放 | 毛片无遮挡 | 免费av在线网| 国产精品免费一区二区三区都可以 | 日韩在线视频二区 | 久草最新| 免费看片网站91 | 免费看成人片 | www.久久久久久久 | 国产又粗又猛又大爽 | 欧美经典一区二区三区 | 免费看国产黄色 | 超碰在线人人 | 精品国产鲁一鲁一区二区三区 | 精品日韩在线播放 | 久久成人免费电影 | 中文字幕在线免费视频 | 黄色av大全 | 久久久99精品国产一区二区三区 | 国产片一区二区三区 | 蜜臀999| 国产免费一区二区三区在线观看 | 超91在线 | www视频在线观看网站 | 少妇爽 | 日本老妇高潮乱hd | 日本高清免费aaaaa大片视频 | 激情综合激情 | 天天摸天天摸 | 久操精品视频 | 日韩精品一区二区三区中文字幕 | 亚洲爽妇网 | 丁香六月激情 | 你懂的网址在线 | 国产精品成人3p一区二区三区 | 男女无遮挡免费视频 | 综合久久综合 | xxxxx黄色片 噜噜噜噜噜色 | 午夜国产精品视频 | 色婷婷综合成人av | 动漫美女视频 | 久久盗摄 | 日韩在线一级 | 无码人妻精品一区二区三区在线 | 国产精品一区二区久久 | 日韩精品在线免费观看 | 天堂久久爱| 欧美三级中文字幕 | 夜夜噜噜噜 | 都市激情亚洲 | 免费欧美大片 | 日本不卡一区在线观看 | 大肉大捧一进一出视频 | 黄色链接视频 | 婷婷亚洲五月 | 亚洲精品久久一区二区三区777 | 精品一区二区三区无码按摩 | 深夜精品 | 日韩素人| 凹凸日日摸日日碰夜夜 | 国产女人被狂躁到高潮小说 | 少妇情理伦片丰满午夜在线观看 | 日批视频在线免费看 | xxxxav| 欧性猛交ⅹxxx乱大交 | 天使色吧 | 男男做爰猛烈啪啪高 | 国产尤物av | 国产精品一区二区毛片 | 亚欧视频在线观看 | 好爽快一点高潮了 | 国产乡下妇女做爰毛片 | 特种兵之深入敌后高清全集免费观看 | 亚洲一区中文字幕永久在线 | 99riav国产精品视频 | 国产精品分类 | 日本韩国在线观看 | 国产成人精品视频在线观看 | 久久精品亚洲精品国产欧美 | 三女同志亚洲人狂欢 | 亚洲精品性 | 明日花绮罗高潮无打码 | 国产一区二区三区久久 | 竹菊影视一区二区三区 | 欧美日韩国产黄色 | 一级片a级片 | 在线岛国 | 五月激情综合 | 国产aⅴ精品一区二区三区久久 | 99在线免费观看 | 少妇高潮惨叫久久久久 | 一本色道久久综合狠狠躁 | 亚洲一区影视 | 亚洲一区二区动漫 | 上原亚衣在线 | 国产精品亚洲无码 | 九色在线观看 |