2014-02-28 22 views
1

我想這種類型只包含值x爲這是(x > 0) && (x <= 10.0)是真的當聲明一個浮動範圍(0,10.0]我有什麼需要注意的

我宣佈我喜歡的類型larger_than_zero這樣:

type a_float is digits 6 range - 1.0E38 .. 1.0E38; 
type larger_than_zero is new a_float range a_float'Adjacent(0.0, 1.0) .. 10.0; 

現在不可能分配0.0larger_than_zero類型的變量。

'Adjacent(A, B)將在下次可能的機器值從A開始不是A,並在於B的方向

我的問題是這是否會導致一些通常不會被期望的奇怪行爲。 也許larger_than_zero'First甚至不是larger_than_zero模型的一部分? 任何指向這個主題的詳細信息的指針都會被引用。

回答

3

它不應該導致任何問題。從技術上講,type上的range聲明完全不影響型號;它僅影響第一個亞型。你的type larger_than_zero聲明定義了一個類型和第一個子類型。該類型包含可用浮點格式表示的每個浮點數,包括負數,零和大於10.0的數字。 第一個子類型是該類型的子範圍,僅包含您在範圍中指定的數字。使用該類型執行計算,並且中間結果可能超出範圍。子類型僅與約束檢查有關;當分配larger_than_zero變量或傳遞larger_than_zero參數時,將檢查該值以確保它在範圍內,如果不是,則會提高Constraint_Error。由於這是該範圍的唯一用途,因此不應引起任何奇怪的行爲。

需要注意的一點是a_float'Adjacent(0.0, 1.0)在不同的實現中可能不會返回相同的結果,即使兩種情況都使用IEEE浮點數,因爲某些實現可能不支持非規格化的數字。它應該是相同的,只要a_float'Denorm返回相同的值(見A.5.3(10))。當然,如果其中一個實現位於不使用IEEE浮點數的計算機上,如VAXes,則值'Adajcent可能會有所不同。當然,z_float'Adjacent(0.0, 1.0)(其中z_float是IEEE 64位浮點數)將與a_float版本不同,假定a_float是32位浮點數。

+0

好的,所以對於子類型,這是很好的定義。如果greater_than_zero會被聲明如下:'type larger_than_zero is digits 6 range a_float'Adjacent(0.0,1.0).. 10.0'? –

+1

@ker如果'a_float'和'greater_than_zero'具有相同的表示形式(即,都是32位IEEE浮點數或都是6​​4位),這將起作用。 'type'聲明等價於'type anonymous是數字6;子類型larger_than_zero是匿名範圍...',但當然,你不能說'anonymous'Adjacent'。 – ajb

相關問題