私はUInt64値の大きな整数値に対して多少の作業をしていますが、Delphiにinteger square root関数があるかどうか疑問に思っていました。 今私はTrunc(Sqrt(x*1.0))
を使用していますが、おそらくインラインアセンブラのスニペットで、よりパフォーマンスの高い方法が必要であると思いますか? (x:UInt64
とSqrt(x)
が故に*1.0
ビット、D7で無効な型のコンパイラエラーがスローされます。)Delphiにはisqrtがありますか?
答えて
私はアセンブリに関するエキスパートからは非常に遠いので、この回答は私をばかにしています。
function isqrt(const X: Extended): integer;
asm
fld X
fsqrt
fistp @Result
fwait
end;
を限り、あなたは前isqrt
を呼び出すには、「切り捨て」にFPU制御ワードの丸め設定を設定するよう:
しかし、これは動作しているようです。最も簡単な方法は、ヘルパー関数に
function SetupRoundModeForSqrti: word;
begin
result := Get8087CW;
Set8087CW(result or $600);
end;
を定義するかもしれないと、あなたは
procedure TForm1.FormCreate(Sender: TObject);
var
oldCW: word;
begin
oldCW := SetupRoundModeForSqrti; // setup CW
// Compute a few million integer square roots using isqrt here
Set8087CW(oldCW); // restore CW
end;
テスト
これは本当に改善していパフォーマンスを行うことができますか?まあ、私は
procedure TForm1.FormCreate(Sender: TObject);
var
oldCW: word;
p1, p2: Int64;
i: Integer;
s1, s2: string;
const
N = 10000000;
begin
oldCW := SetupRoundModeForSqrti;
QueryPerformanceCounter(p1);
for i := 0 to N do
Tag := isqrt(i);
QueryPerformanceCounter(p2);
s1 := inttostr(p2-p1);
QueryPerformanceCounter(p1);
for i := 0 to N do
Tag := trunc(Sqrt(i));
QueryPerformanceCounter(p2);
s2 := inttostr(p2-p1);
Set8087CW(oldCW);
ShowMessage(s1 + #13#10 + s2);
end;
をテストし、その結果そこで
371802
371774.
を持って、それは単にそれだけの価値はありません。純粋なアプローチtrunc(sqrt(x))
は、読んだり保守するのがはるかに簡単で、優れた将来性と後方互換性を持ち、エラーを起こしにくいです。
とdownvoteの理由は? –
@Andreas +1沈黙のダウンボッターを補う! –
ああ、説明はもう必要ありません。それでは幸せな補償。 –
私は答えは何も、それは整数平方根機能を持っていないし、あなたのソリューションが合理的であるということではないと信じています。
私は浮動小数点値に変換するために1.0倍にする必要性に少し驚いています。私はそれがDelphiのバグでなければならないと思うし、最近のバージョンはあなたが望むように動作することは確かです。
とdownvoteの理由は? (私は+1を "補償"します) –
今、2^32マークを超えています。私はEInvalidOpを取得します:無効な浮動小数点演算が私のトリックに...私は実装に至っていると思いますisqrtをステップごとに計算する古いスキルのアルゴリズム... –
@stijnあなたはuint64に戻っていますか? –
これはone of the algorhythms listed on wikipedia
type
baseint=UInt64;//or cardinal for the 32-bit version
function isqrt(x:baseint):baseint;
var
p,q:baseint;
begin
//get highest power of four
p:=0;
q:=4;
while (q<>0) and (q<=x) do
begin
p:=q;
q:=q shl 2;
end;
//
q:=0;
while p<>0 do
begin
if x>=p+q then
begin
dec(x,p);
dec(x,q);
q:=(q shr 1)+p;
end
else
q:=q shr 1;
p:=p shr 2;
end;
Result:=q;
end;
- 1. DelphiにHashSetがありますか?
- 2. Delphiにカラーマップコントロールはありますか?
- 3. Delphi Chromiumに問題があります
- 4. Delphi用のキャッシングフレームワークはありますか?
- 5. Delphi XE2スタイルギャラリーはありますか?
- 6. DelphiのMapReduceライブラリはありますか?
- 7. Delphi xe、ユニットdbExceptが見つかりません。 Delphi 2009にありました
- 8. DelphiのdxDBGridに複数の列ヘッダー行がありますか?
- 9. Delphi XE4にTMapクラスがありますか?
- 10. Delphiのクラス変数には、グローバルまたはスレッドローカルストレージがありますか?
- 11. Embarcadero Delphi Anchor Sides/AnchorToNeighbourにはオプションがあります
- 12. Delphi XE2のXMLデータバインディングウィザードはどこにありますか?
- 13. Delphiの属性の実例はどこにありますか?
- 14. .NETにはDelphiのEAbortと同様の例外がありますか?
- 15. Delphi 2006 - XEには新しい並列プログラミング機能がありますか?
- 16. .NETにはDelphiのVCLコンポーネントモデルと同等の機能がありますか?
- 17. Delphiには二重引用符文字列関数がありますか?
- 18. 無料で安価なDelphiグリッドコントロールがありますか?
- 19. Delphi Tokio IDE - カスタマイズする方法はありますか?
- 20. Delphi OOPでは、オブジェクトはいつ値を返す必要がありますか?
- 21. Visual StudioにDelphiのActionManagerの代替手段があります
- 22. Delphi用の「Fast Infoset」XML圧縮ライブラリはありますか?
- 23. Delphiのインターフェイス汎用関数 - 回避策はありますか?
- 24. オブジェクトインスペクタグリッドの高さの修正はありますか? Delphi 2010
- 25. Delphi用の単純なテキスト差分ユニットはありますか?
- 26. Delphi IDE用のgitプラグインはありますか?
- 27. DelphiのSystem.Fracと同等のメソッドはありますか?
- 28. Delphi用のUnicode照合アルゴリズム(UCA)コードはありますか?
- 29. Delphi(非OLE)用のOpenOffice.orgエクスポートコンポーネントはありますか?
- 30. Delphiのdcmemo(Dream Company)の代わりになるコンポーネントはありますか?
に基づいて、私が使用して終了コード、うん、 '* 1.0'は、以降のバージョンで修正されました。それ以降のバージョンは確かではありませんが、D2010では正しく動作します。 –