2012-02-15 6 views
1

Delphi XE2のSystem.Strで何かが変更されました。次の手順: 'I' と 'J' のDelphi XE2でDelphi XE2 - System.Strが変更されましたか?

procedure someProcedure; 
var 
    E:double; 
    outString:string; 
begin 
    E:=-1.7E+308; 
    Str(E:i:j, outString); 
end; 

は、アクセス違反

(アドレス0x30303028の読み例外クラスの$ C0000005、0x00407318でのアクセス違反)を発生させますどんな整数でもあります。この同じコードはDelphi 2010でうまく動作し、outString = '-1.7E + 0308'を返します。同様のコードがTurboPower Orpheusコンポーネントのいくつかで使用され、IDE全体がBEXエラーでクラッシュします。

これはWin7 64ビット版です。何か案は?

編集:追加情報

これは大きな負の数値でのみ発生するようです。 Strは長い文字列を生成して、130文字を超えると壊れてしまうようです。

注:幅のみを使用している場合、これは壊れません(私はいくつかの幅を=場所)

procedure someProcedure; 
var 
    E:double; 
    outString:string; 
begin 
    E:=-1.7E+308; 
    Str(E:i, outString); 
end; 
+0

これは精度エラーではありません。これは、-1.6E117がバイナリ浮動小数点形式で正確に表現できないという事実です。 –

+0

回避策として、おそらくそれが0より小さいかどうかをテストし、記号を否定し、文字列に ' - 'を付けます。 – CodesInChaos

+2

実際、XE2はそれを正しくしています。 '1.60000000000000002E + 0117'が正しいです。 Rob Kennedyの最も役に立つページを見てください:http://pages.cs.wisc.edu/~rkennedy/exact-float?number=-1.6e117 –

答えて

7

は、それは明らかに大規模な大きさの負の数の取り扱いとバグです。正の数はうまく処理されます。 Strへの呼び出しを傍受できる場合は、Strに正の数を渡してから、-の接頭辞を付けてください。

私はバグをQuality Central:QC#103436に提出しました。

+0

あなたがこれを書いていたときに大きなネガを少し追加していました。正の値にも影響を与える精度誤差があります。 –

+3

@J ...精度エラーはありません。番号は正確に表現できません。 –

+0

いずれにしても、私は瞬間をつくるときにQCします。回避策はかなり明白ですが、最初は壊れてはいけないもののように見えました。 –

関連する問題