2011-12-29 4 views
2

私は指数関数がO(log n)かそれ以上の場合が多いことを知っていますが、数値がどのように表現されるかを理解しようとして迷っています。O(log n)よりも10倍のパワーを得ることができますか?

内部
100000 === 1E5 && 100000 === 0303240 
>>> true 

を、彼らはすべてのメモリに格納されたバイナリ値として保存され、操作されてしまうしません:それはいくつかのネイティブ番号の形式を持っているので、例えば、JavaScriptを取りますか?もしそうなら、マシンは、8進数と同じくらい速く、10進数表記と科学記法表記を保存できますか?

こうして、あなたは+("1E" + n)Math.pow(10, n)より速いことを期待するでしょうか?

は主にこの質問は1E(n)がどのように機能するかについてですが、答えについて自分自身を考えるしようとしている中で、私は数が解析され、最初の場所に保存されている方法の詳細については好奇心旺盛になりました。私はあなたが提供できる説明があれば感謝します。

答えて

1

が、私は数字が表現されている方法で自分自身を理解しようとして迷子にしています。たとえば、JavaScriptには、いくつかのネイティブの数値形式があるため、次のようになります。

内部的には、JavaScriptで

うんは、唯一の数は64ビットfloat型従って

1 === 1.0 

http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference

もしそうであれば、小数および科学的表記を記憶することができるマシンであるタイプがあります表現は8進数と同じくらい速いですか?

もう1つのタイプがあるため、もう一度します。 (わずかな違いがあるかもしれませんが無視してください)

しかし、この特定のケースでは、表現できる数値には〜1e300しかないため、ランタイムはO(〜300)= O )他のすべての数字は+/- Infinityで表されます。

したがって、+( "1E" + n)がMath.pow(10、n)より速くなると思いますか?

かなりです! 1E100はMath.pow(10、n)よりも速い しかし、+( "1E" + n)はMath.pow(10、n)よりも遅い。 文字列とメモリの割り当てが原因ではなく、JSインタプリタが文字列を解析して数字に変換し、ネイティブのMath.pow(num、num)操作よりも遅いためです。

jsperf test

+0

慎重にレイアウトされていただきありがとうございます、よくサポートされた答え。 – kojiro

3

文字列操作が高速であるとは思わないが、少なくとも連結によって新しいオブジェクト(メモリ割り当て、GC用のジョブ)が作成されるため、通常Math.powは単一マシン命令になります。

はまた、いくつかの近代的なJSのVMは、JavaScriptからマシンコードを生成、ホットスポットの最適化を行います。 Math.powのためのそれのチャンスがありますが、文字列の魔法のためにほとんど不可能です。

Math.powがアプリケーションで遅い(確信できない)ことを100%確信すれば、アレイルックアップを使用することができます。できるだけ高速に動作するはずです:[1,10,100,1000,10000,...][n]。配列は比較的小さく、複雑さはO(1)です。それはインタプリタが整数のために最適化しないという条件で、あらゆる数のために同じように遅いので

+0

[10^1、10^2、...](私は知っている^ JSの力ではない) –

+0

@TomRoggeroより良い[1e0,1e1,1e2,1e3、...] – kan

0

Math.powは番号を区別しません。数回の浮動小数点数を割り当てるだけです。私は解析時間を無視しています。

「1E」+ nが、非常に実質的なメモリのオーバーヘッドを有する可能性がある2〜3文字列オブジェクトを割り当てる中間体を破壊し、そして数としてそれを再解析します。 powよりも速くなることはまずありません。私は再び解析時間を無視しています。

1

オプションでjsperfを実行しました。

var sum = 0; 
for (var i = 1; i < 20; ++i){ 
    sum += +("1E" + i); 
} 

は文字列連結のために遅いです。

var sum = 0; 
for (var i = 0; i < 20; ++i){ 
    Math.pow(10, i); 
} 

は、数値だけで動作するため、高速です。

var sum = 0; 
sum += 1e0; 
sum += 1e1; 
... 
sum += 1e19; 

定数の1exが事前に計算値なので、最速が、唯一の可能性があります。

最高のパフォーマンスを得るには、自分で回答を事前に計算したいと思うかもしれません。

関連する問題