【问题标题】:What is the difference between float32 vs single and float vs double, if any?float32 vs single 和 float vs double(如果有的话)有什么区别?
【发布时间】:2016-09-15 17:42:25
【问题描述】:

我一直认为float32single 类型可以互换,因为它们是类型别名。 floatdouble 也是如此。但是,它们似乎在 Microsoft.FSharp.Core.OperatorsMicrosoft.FSharp.Core.ExtraTopLevelOperators 的不同程序集中声明。

此外,弹出窗口的描述略有不同,F# 在float32float 上表示它可以接受一个字符串并在其上使用Parse()

但是,尝试使用 singledouble 也可以成功:

let x = single "12.3"
let y = double "13.4"

有什么我应该注意的区别吗?我一直交替使用它们,从来没有真正考虑过,直到我看到弹出窗口和签名中的差异:

// on hovering, or in FSI, this will have the slightly confusing signature:
// val x: a: double -> float
let x (a: double) = float a 

【问题讨论】:

  • System.Object.ReferenceEquals(typeof<single>,typeof<float32>);; System.Object.ReferenceEquals(typeof<double>,typeof<float>);;
  • @PetSerAl:如果它们在引用上是相等的(你的建议是有道理的,而且它们确实是相等的),你如何解释它们在 UI 和程序集中不同位置的差异?或者这只是 F# 玩心机?

标签: f# double type-alias


【解决方案1】:

所有这些都只是相应 CLR 类型的别名,如您在 prim-types-prelude.fs 中所见。

至于令人困惑的签名考虑这个:

type typA = A;;

type typB = typA;;

let f (x : typA) = (x : typB)
//val f : x:typA -> typB

似乎 F# 更喜欢在您(或其他定义)使用别名的地方使用别名。

最后,您所指的命名空间 (FSharp.Core.Operators) 指的不是float type,而是float function (float : 'T -> float)。见prim-types.fs

【讨论】:

  • 感谢您的指点。你是对的,ExtraTopLevelOperators 当然是用于功能的。我错误地认为这是类型的位置。仍然奇怪的是,这些功能的位置不同并且有不同的工具提示,但行为相同(据我所知)。
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2022-08-17
  • 2014-07-01
相关资源
最近更新 更多