2016-07-16 3 views
2

最近、構造体に型制限を追加することができましたが、何らかの理由で0.0を正当なデフォルト値として使用できません短い浮動小数点数は、それでも100.0を許可します。フィールドはSHORT-FLOAT型ではなく値(0.0)に評価されました

は、私はCLISPにship構造体のインスタンスを作るためにmake-shipを実行しようとすると、次のエラーを取得する:

[4]> (make-ship) 

*** - THE: #:ENERGY evaluated to the values (0.0), not of type SHORT-FLOAT 
The following restarts are available: 
ABORT   :R1  Abort main loop 

は誰かが正確に何が起こっているかを説明することができ、そしてなぜ私はに許可されていませんよ0.0を使用しますか?ここで

が誤動作コードです:

(defstruct ship 
    location ;; fields like these have an undecided type at the moment 
    (energy 0.0 :type short-float) 
    cargo 
    crew 
    shields 
    (hull-integrity 100.0 :type short-float)) 
+0

詳しい説明はありませんが、さまざまな接尾辞(たとえば、「0.0d」など)を試してみましたか? –

+0

@JoshuaTaylor私は接尾辞が何かさえわからなかった... –

+0

http://www.lispworks.com/documentation/HyperSpec/Body/02_cbb.htmを参照してください。私は働くべきだと思う。 –

答えて

4

Common Lispは2.3.2.2 Syntax of a Floatで説明した山車の異なる種類の、のための構文があります。例の1つは、0を短い浮動小数点として書く方法を示しています。0s0および0.0s0の両方が機能します。

+0

奇妙なことは、私が使用したコードは、ハイパースペックのstructの例から直接取っていることです。 –

+1

今はチェックすることはできませんが、デフォルトのfloat形式などを調べることはできません。型が指定されていないときの浮動小数点数。したがって、仕様の例は正当なものかもしれませんが、必須ではありません。 –

2

CLISPはSINGLE-FLOAT0.0または0.0e0)とSHORT-FLOAT0s0)を区別することが表示されます。したがって、(make-ship)コールは失敗します。修正するには0.0100.0をそれぞれ0s0100s0に置き換えるか、SHORT-FLOATSINGLE-FLOATに置き換えてください。

PS:SBCLとECLの両方で、これらの浮動小数点を区別しないので、例はそのまま動作します。

3

ないexponent marker、または「e」指数マーカーで使用されているがない場合、次に読み込ま浮動小数点数の種類は、必ずしもSHORTないデフォルトSINGLE-FLOATグローバル変数*READ-DEFAULT-FLOAT-FORMAT*、によって決定されます-浮く。

関連する問題