1

私はADA Distilledを読んで Ada 言語を学び始めています。3.8章では、次のように述べています。

Ada プログラマーは、事前定義された実数型を安全性が重要な製品品質のソフトウェアに使用することはありません。

これが実際に何を意味するのか、定義済みの実際の型を使用する代わりに何をすべきなのか疑問に思っていました。これは、整数を使用できないということですか?

4

3 に答える 3

4

作者が何を考えていたのかわからないので、彼がそれを説明してくれたらよかったのにと思います。個人的には、何の説明もなく受け継がれてきたルールが嫌いで、読者はそれを「受けた知恵」として受け入れることを期待しています。(著者に反対するものは何もありません。彼がいい人であることは知っています。)

そうは言っても、私の考えは次のとおりです。

Ada の最初のバージョンである Ada 83 では、定義済みIntegerの とFloatの型があり、実装によって と のような他の型が提供される可能性があるLong_Integerと述べられていましたLong_Float。ただし、言語は実装の定義に境界を設けませんでした。理論的には、実装は、Integer-2 から +1 までの値のみを保持する 2 ビット幅の型を提供できます。(これはコンパイラの販売にとっては悪いことですが、言語定義に準拠することになります。) 事前定義された型がプログラムのニーズを満たすのに十分な大きさまたは (float の場合) 十分に正確であるという保証はなかったので、プログラマは奨励されました。目的の範囲と精度を指定する独自の整数型と浮動小数点型を常に定義します。

Ada 95 では、いくつかの制約Integerが追加されました。少なくとも -32768..32767 の範囲の値を保持する必要がありFloat、実装が正確な浮動小数点数をサポートしている場合は、10 進数 6 桁の精度をサポートする必要がありました。そのため、定義済みの型を避ける動機の一部がなくなりました。6 桁を超える精度を必要としないような計算であれば、問題ありませんFloat。の精度が 6 桁より低い場合Float、実装は 6 桁をまったくサポートできず、独自の float を定義しても改善されません。したがって、別のコンパイラに移行する必要がないことがわかっている場合は、おそらく問題ありません。

それでも、整数型では発生しない移植性の問題が発生する可能性があります。Integer変数が -32768..32767 の範囲外の値を保持しない場合、16 ビット タイプのマシンから 24 ビットまたは 32 ビットなどの別のマシンに移動する際に問題が発生することはありIntegerませんIntegerInteger-計算は同じように機能するはずです。しかし、浮動小数点数については同じことは言えません。Float浮動小数点の丸めとは、32 ビット IEEE 浮動小数点で一方向に動作するプログラムFloatが、64 ビット IEEE 浮動小数点であるマシンに移動した場合、またはその逆の場合に異なる動作をする可能性があることを意味します。プログラムがあり、32 ビットの float が突然すべて 64 ビットの float に変更された場合は、徹底的に再テストする必要があります。何かが壊れる可能性は十分にあります。

ただし、独自の浮動小数点型を定義する場合は、少なくとも実装を IEEE 浮動小数点数を使用するものに限定する場合は問題ありません。(これは最近のほとんどのマシンですが、独自の浮動小数点形式を使用するいくつかの VAX がまだ存在している可能性があります。それらの獣のいくつかがまだ使用されていても、私は驚かないでしょう。) IEEE-float マシンと非 IEEE-float マシンの間で移行する必要がある場合、独自の浮動小数点定義を作成するだけでは不十分な場合があります。精度はわずかに異なる可能性があり、結果はまったく同じではない可能性があります。

于 2016-01-26T05:22:20.517 に答える
1

これは、「常に」[*] 問題に一致する型を定義する必要があることを意味します。

[*] 問題に文字列の処理が含まれている場合は、そのために (およびその中のインデックス付けのために)標準String型を使用することをお勧めします。Positive他にも同様の例外がありますが、定義済みの型を使用する理由を説明できない限り、使用しないでください。

于 2016-01-25T13:47:46.167 に答える