アカウント名:
パスワード:
数値演算の精度を端折って高速化したと。
浮動小数点演算で、64ビットのdouble型演算の代わりに、可能な限り32ビットのfloat型の演算を使用することで、大幅にその演算速度が向上したという。
数値演算の精度が問題になる場面で、不具合が起きなければいいが・・・Officeスウィート系のWebアプリは怖くて使えんなあ。
明らかに処理の内容を変えて「高速化」というのは疑問を感じますね。それで、C++に迫ったといわれてもなんか違う。
世の中の最適化を全否定だな。答えが一緒なら処理なんて関係ないでしょ。
型が単精度から倍精度に変わるんだよ?常に答えが一緒になるとは限らないでしょ。
んで、最適化によって値が変わる可能性があるから、Cとかにはvolatileが用意されてるわけで。JavaScriptにvolatileに相当するものは私の知る限りは無いはず。そういう言語で値が変わるかも知れない最適化ってのはちょっと問題ある気がする。
JavaScriptの仕様的にはオーバーフローしたら倍精度に勝手に変換するみたいだけど、そこら辺どうなんだろ。仕様に合わせて内部処理を最適化しただけって話ならいいんだけど。
それ以前に浮動小数点演算は精度に関係なく答が一緒になる保証などない。
釣り?入力が同じなら出力は同じだよ?
マクロな話してるんでしょ例えばsinとかは同じdoubleでも実装や言語によって全然違うし
同じソースプログラム、同じ動作環境でも、コンパイラの最適化やx87とSSEの違いなんかで簡単に違う結果になるよ。
入力が同じで出力が一緒にならない例
#include <stdio.h>#include <limits.h>
int main(){ const int x = INT_MAX; double e0 = 1.0; double e1 = 1.0; double e2 = 1.0; double e3 = 1.0; double e4 = 1.0; double e5 = 1.0; double e6 = 1.0; double e7 = 1.0;
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
※ただしPHPを除く -- あるAdmin
数値演算の精度が問題になることないの? (スコア:0)
数値演算の精度を端折って高速化したと。
浮動小数点演算で、64ビットのdouble型演算の代わりに、可能な限り32ビットのfloat型の演算を使用することで、大幅にその演算速度が向上したという。
数値演算の精度が問題になる場面で、不具合が起きなければいいが・・・Officeスウィート系のWebアプリは怖くて使えんなあ。
Re: (スコア:0)
明らかに処理の内容を変えて「高速化」というのは疑問を感じますね。
それで、C++に迫ったといわれてもなんか違う。
Re: (スコア:0)
世の中の最適化を全否定だな。答えが一緒なら処理なんて関係ないでしょ。
Re: (スコア:0)
型が単精度から倍精度に変わるんだよ?
常に答えが一緒になるとは限らないでしょ。
んで、最適化によって値が変わる可能性があるから、Cとかにはvolatileが用意されてるわけで。
JavaScriptにvolatileに相当するものは私の知る限りは無いはず。
そういう言語で値が変わるかも知れない最適化ってのはちょっと問題ある気がする。
JavaScriptの仕様的にはオーバーフローしたら倍精度に勝手に変換するみたいだけど、そこら辺どうなんだろ。
仕様に合わせて内部処理を最適化しただけって話ならいいんだけど。
Re:数値演算の精度が問題になることないの? (スコア:0)
型が単精度から倍精度に変わるんだよ?
常に答えが一緒になるとは限らないでしょ。
それ以前に浮動小数点演算は精度に関係なく答が一緒になる保証などない。
Re: (スコア:0)
釣り?
入力が同じなら出力は同じだよ?
Re: (スコア:0)
マクロな話してるんでしょ
例えばsinとかは同じdoubleでも実装や言語によって全然違うし
Re: (スコア:0)
同じソースプログラム、同じ動作環境でも、コンパイラの最適化やx87とSSEの違いなんかで簡単に違う結果になるよ。
Re: (スコア:0)
入力が同じで出力が一緒にならない例
#include <stdio.h>
#include <limits.h>
int main()
{
const int x = INT_MAX;
double e0 = 1.0;
double e1 = 1.0;
double e2 = 1.0;
double e3 = 1.0;
double e4 = 1.0;
double e5 = 1.0;
double e6 = 1.0;
double e7 = 1.0;