簡體   English   中英

ECLiPSe CLP生成具有意外范圍的變量

[英]ECLiPSe CLP produces variable with unexpected range

我對以下代碼有疑問:

:-lib(ic).

buggy_pred(Result, In0, In1, In2, In3, In4, In5, In6, In7) :-

    Args = [In0, In1, In2, In3, In4, In5, In6, In7],
    Args :: [0..255],

    Result :: [0..18446744073709551615],    % 64bits wide

    % put 8 bytes together to form a 64-bit value
    Result #= (In0 + (In1 * 256) + (In2 * 65536) + (In3 * 16777216) + (In4 * 4294967296) +
        (In5 * 1099511627776) + (In6 * 281474976710656) + (In7 * 72057594037927936)).


buggy_pred_test :-
    buggy_pred(Result, 56, 8, 0, 0, 16, 0, 0, 1),
    get_bounds(Result, Lo, Hi),

    write(Lo), nl,
    write(Hi).

不應該上面的代碼(謂詞buggy_pred_test)打印兩個相同的數字? 在這種情況下,它產生兩個不同的數字(分別為Lo和Hi):

72057662757406720
72057662757406800

我無法弄清楚這種行為的原因是什么。 我正在使用ECLiPSE 6.1#194,x86_64 for linux。 非常感謝您的幫助。

ECLiPSe的lib(ic)約束求解器設計用於處理實數整數值變量/約束的混合。 使用雙浮點表示所有計算以表示上限和下限,甚至是整數運算(完整性僅被視為附加約束)。

因為雙浮點數具有53位精度,所以只能精確表示-9007199254740991..9007199254740991范圍內的整數。 較大的整數由包含真值的浮點間隔近似。 這就是為什么你得到一個非零寬度的間隔。

這可能聽起來不令人滿意,但實際上涉及巨大整數域的模型很少能夠有效解決,因此它們看起來不那么有用。 因此,建議是以不同方式對問題進行建模,請參閱此處以兩種方式對問題進行建模。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM