簡體   English   中英

在Ocaml中減法,我無法完全確定該錯誤

[英]Subtraction in Ocaml, I can't quite nail down this bug

let rec sub' list1 list2 carry = match (list1, list2, carry) with
    | list1, [], 0       -> list1
    | [], list2, 0       -> list2
    | list1, [], carry   -> sub' list1 [carry] 0
    | [], list2, carry   -> sub' [carry] list2 0
    | car1::cdr1, car2::cdr2, carry ->
      let minus = car1 - car2 + carry



       in  minus mod radix :: sub' cdr1 cdr2 (minus / radix)

基數設置為10

因此,這是我必須減去兩個數字(list1和list2)的代碼。 這是基於我修改的給定代碼,因此我不確定它是如何工作的。 但是,對於大多數事情,它確實有效。 5-4 = 1 10-20 = -10等

但是,對於較大的數字,它具有此怪異的錯誤,接近100-50 =“ 1-50”,具有我們想要的“ 50”,但有一些額外的垃圾。

我一直在試圖弄清楚這一點,但我很困惑。

編輯:

let length    = List.length
let car       = List.hd
let cdr       = List.tl
let map       = List.map
let reverse   = List.rev
let strcat    = String.concat
let strlen    = String.length
let strsub    = String.sub
let zero      = Bigint (Pos, [])



let rec zeros' rev = 
if (car rev) = 0 then
  lead_zeros' (cdr rev)
else (reverse rev)

let zeros list = match list with
| [0] -> list
| [] -> []
| list -> let reversed = reverse list
          in lead_zeros' reversed

我沒有完全分析您的代碼,但是我相信問題是除法四舍五入到零,而您需要四舍五入。 例如, (-3) / 5 = 0(-3) mod 5 = -3而您將需要(-3) / 5 = -1(-3) mod 5 = 2

似乎不變式是minus >= -radix ,因此一個簡單的解決方法是將radix加到minus並相應地調整所有其他值:

let minus = car1 - car2 + carry + radix
  in  minus mod radix :: sub' cdr1 cdr2 (minus / radix - 1)

這會將除法和取模移到非負范圍,如預期那樣工作。

暫無
暫無

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

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