首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ocaml中的减法,我不能完全确定这个bug

Ocaml中的减法,我不能完全确定这个bug
EN

Stack Overflow用户
提问于 2016-10-24 11:53:30
回答 1查看 364关注 0票数 0
代码语言:javascript
运行
复制
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等

但是,对于更大的数字,它有一个奇怪的bug,100 - 50 = "1-50“,这是接近的,它有我们想要的"50”,但有一些额外的垃圾。

我试图弄清楚这个问题已经有一段时间了,但我还是被卡住了。

编辑:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2016-10-25 18:39:39

我没有完全分析你的代码,但我相信问题是除法舍入为零,而你需要它四舍五入。例如,(-3) / 5 = 0(-3) mod 5 = -3,而您需要(-3) / 5 = -1(-3) mod 5 = 2

似乎不变量是minus >= -radix,所以一个简单的修复方法是将radix添加到minus中,然后相应地调整其他所有内容:

代码语言:javascript
运行
复制
let minus = car1 - car2 + carry + radix
  in  minus mod radix :: sub' cdr1 cdr2 (minus / radix - 1)

这将除法和模数转换到非负范围,在那里它可以像预期的那样工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40210447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档