gpt4 book ai didi

F# 无法捕获 DivideByZeroException

转载 作者:行者123 更新时间:2023-12-03 20:08:42 26 4
gpt4 key购买 nike

我试图在执行除以 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

最佳答案

一个 float在 F# 中是 64 位 IEEE 754 double-precision number .它们具有明确定义的 ±0、±infinity 和 NaN 值。

对于所有被零除的浮点数 ( except decimal ),一个 DivideByZeroException不会抛出,而是使用类型的特殊表示。

> let ``+∞``, ``-∞`` = 1.0 / 0.0, -1.0 / 0.0;;
val ( -∞ ) : float = -infinity
val ( +∞ ) : float = infinity

在您的示例中,除以零将为您提供 Double.PositiveInfinity .
如您所料,整数值( intlonguint 等)都会被零除。

关于F# 无法捕获 DivideByZeroException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60975739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com