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;
これは精度エラーではありません。これは、-1.6E117がバイナリ浮動小数点形式で正確に表現できないという事実です。 –
回避策として、おそらくそれが0より小さいかどうかをテストし、記号を否定し、文字列に ' - 'を付けます。 – CodesInChaos
実際、XE2はそれを正しくしています。 '1.60000000000000002E + 0117'が正しいです。 Rob Kennedyの最も役に立つページを見てください:http://pages.cs.wisc.edu/~rkennedy/exact-float?number=-1.6e117 –