Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#无法捕获DivideByZeroException_F# - Fatal编程技术网

F#无法捕获DivideByZeroException

F#无法捕获DivideByZeroException,f#,F#,当执行除法0时,我试图捕获一个异常,但是,无论实现如何,代码都没有显示任何实质内容,总是声称结果是“无穷大”(从我得到的信息来看,这意味着它只执行了除法,而忽略了其他所有内容) 原因是什么?如何补救 open System type instruction = | ADD | SUB | MUL | SQR | DIV | PUSH of float type stack = float list exception BLEDNY_PROGRAM of (instr

当执行除法0时,我试图捕获一个异常,但是,无论实现如何,代码都没有显示任何实质内容,总是声称结果是“无穷大”(从我得到的信息来看,这意味着它只执行了除法,而忽略了其他所有内容)

原因是什么?如何补救

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
F#中的
float
是一个64位的IEEE 754。它们具有定义良好的±零、±无穷大和NaN值

对于所有浮点除以零(),不会抛出
dividebyzeroception
,而是使用类型的特殊表示

> let ``+∞``, ``-∞`` = 1.0 / 0.0, -1.0 / 0.0;;
val ( -∞ ) : float = -infinity
val ( +∞ ) : float = infinity
在您的示例中,除以零将得到
Double.PositiveInfinity
。 整数值(
int
long
uint
,等等)都会像预期的那样抛出一个被零除的结果