为什么F#没有针对浮点类型的Checked函数?

时间:2015-12-22 12:21:58

标签: casting f# floating-point

内置的Checked模块具有所有整数类型的转换,但不包含float(System.Double)或float32(System.Single)的转换。

  1. 为什么会这样?

  2. 如果我需要为float或float32转换可能是也可能不是整数类型的数字,是否有任何推荐的替代方法?

  3. 是否有用于转换为整数类型的内置函数,还检查输入是否没有小数部分? string constants = "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>"; string placeHolder = string.Empty; List<string> filteredkeys = new List<string>(); List<string> formattedKeys = new List<string>(); filteredkeys.Add("A:aaa;E:eee;"); filteredkeys.Add("D:ddd;"); filteredkeys.Add("B:bbb;E:eee;"); foreach (var item in filteredkeys) { placeHolder = constants; List<string> keyCombination = item.TrimEnd(';').Split(';').ToList(); foreach (string keys in keyCombination) { List<string> abc = keys.Split(':').ToList(); switch (abc[0]) { case "A": placeHolder = placeHolder.Replace("A:<<Default>>", keys); break; case "B": placeHolder = placeHolder.Replace("B:<<Default>>", keys); break; case "C": placeHolder = placeHolder.Replace("C:<<Default>>", keys); break; case "D": placeHolder = placeHolder.Replace("D:<<Default>>", keys); break; case "E": placeHolder = placeHolder.Replace("D:<<Default>>", keys); break; } } formattedKeys.Add(placeHolder); } 返回Checked.byte 3.13引发Checked.byte "3.1"似乎很奇怪。

1 个答案:

答案 0 :(得分:3)

float中定义了float32FSharp.Core.Operators个函数。

e.g。

let a = float 56

FSharp.Core.Operators.Checked包含可以选择用于执行已检查的函数,而不是FSharp.Core.Operators中定义的默认的,未经检查的算术。

默认情况下包含

FSharp.Core.Operators,因此这些函数可自动使用,但您可以通过打开Checked来隐藏其中一些具有替代检查实现的函数。使用检查算术时,溢出会引发异常。

floatfloat32没有检查FSharp.Core.Operators.Checked中定义的替代方案,因为它们的行为没有改变,这些类型是IEEE标准化的,内置特殊值来表示正面和负面另一方面,积分类型没有特殊值,它们只是一个数字范围,所以当你超出范围时的行为可以用不同的方式处理。

例如,我们可以看到,如果我们查看F#核心源代码,那么对于float,已检查和未检查的加法函数都会转换为IL op add,同时转换整数加法根据所使用的算术类型,可以add.ovfadd

请参阅:

https://github.com/fsharp/fsharp/blob/8f02ecb0b79947e67e6a0ef9c482d167baf17696/src/fsharp/FSharp.Core/prim-types.fs#L3905

https://github.com/fsharp/fsharp/blob/8f02ecb0b79947e67e6a0ef9c482d167baf17696/src/fsharp/FSharp.Core/prim-types.fs#L4804

我不知道任何内置的替代函数拒绝3.1但接受3.0。据推测,如果成功,您可以使用Option撰写内容以返回Some byte,否则返回None。但请注意,浮点数并非所有整数值都可以完全表示,因此您必须决定如何处理它。