首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#无法捕获DivideByZeroException

F#无法捕获DivideByZeroException
EN

Stack Overflow用户
提问于 2020-04-01 16:29:05
回答 1查看 157关注 0票数 5

当执行除以0时,我会突然捕捉到异常,但是,无论实现是什么,代码都没有显示任何实质内容,总是声称结果是“无穷大”(从我所得到的结果来看,它只是执行了除法,忽略了其他一切)。

原因是什么,以及如何补救呢?

代码语言:javascript
复制
open System

type instruction = 
  | ADD
  | SUB
  | MUL
  | SQR
  | DIV
  | PUSH of float
type stack = float list

exception BLEDNY_PROGRAM of (instruction * stack)
exception DivideByZeroException

let intInstr (x, y) = 
        match x, y with
        | ADD, a::b::ys -> (b + a) :: ys : stack
        | SUB, a::b::ys -> (b-a)::ys
        | MUL, a::b::ys -> (b*a)::ys
        | SQR, a::ys -> (a * a)::ys
        | DIV, a::b::ys -> try (b/a)::ys with | :? System.DivideByZeroException -> (printf "Błąd: dzielenie przez zero"; ys)
        | PUSH x, ys -> x::ys
        | _ , _ -> raise (BLEDNY_PROGRAM(x, y));

let intpProg(is) =
   let rec iPS = function
           | ([],x::xs) -> x
           | (i::is, xs) -> iPS(is, intInstr(i, xs))
   iPS(is,[])

let il3 = [PUSH 3.0; PUSH 0.0; DIV];
let e = intpProg(il3)
printfn "%A" e
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 17:53:23

float in F#是64位IEEE 754 双精度数.它们对±零、±无穷大和NaN有很好的定义.

对于所有浮点除以零(除十进制外),不抛出一个DivideByZeroException,而是使用该类型的特殊表示。

代码语言:javascript
复制
> let ``+∞``, ``-∞`` = 1.0 / 0.0, -1.0 / 0.0;;
val ( -∞ ) : float = -infinity
val ( +∞ ) : float = infinity

在您的示例中,除以零将给出Double.PositiveInfinity。整数值(intlonguint等)都会像预期的那样抛出一个除数为零。

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

https://stackoverflow.com/questions/60975739

复制
相关文章

相似问题

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