Types Int上的F平方根

Types Int上的F平方根,types,f#,floating-point,int,sqrt,Types,F#,Floating Point,Int,Sqrt,我正在用F编写一个程序,在这个程序中,我需要计算整数值的平方根。 我搜索并发现没有一个函数允许在不使用强制转换int->float的情况下执行该操作 是否有一个函数允许在不进行不必要的强制转换的情况下生成整数的平方根?如果您只想要一个接受整数并将其平方根作为浮点返回的函数,那么使用浮点函数将int转换为浮点,然后调用sqrt是一种方法: sqrt (float n) 原则上,F可以隐式地允许这种转换,但我认为它不能这样做,因为它不清楚整数的平方根应该是什么,正如在注释中所讨论的那样。在C中,您

我正在用F编写一个程序,在这个程序中,我需要计算整数值的平方根。 我搜索并发现没有一个函数允许在不使用强制转换int->float的情况下执行该操作


是否有一个函数允许在不进行不必要的强制转换的情况下生成整数的平方根?

如果您只想要一个接受整数并将其平方根作为浮点返回的函数,那么使用浮点函数将int转换为浮点,然后调用sqrt是一种方法:

sqrt (float n)
原则上,F可以隐式地允许这种转换,但我认为它不能这样做,因为它不清楚整数的平方根应该是什么,正如在注释中所讨论的那样。在C中,您可以编写Math.Sqrtn,但这是可行的,因为C允许在程序中的任何位置从int隐式转换为float


如果你想要一个返回整数的平方根If integer,那么没有评论中讨论的标准方法,所以你需要实现你需要的功能。

我很难理解为什么限制int输入,但是如果这很重要,可以使用分治算法。在任何具有硬件浮动的CPU体系结构上,这比sqrt float n慢得多

let isqrt n =
  let rec loop b e =
    let i = (b + e) >>> 1
    let i2 = i*i
    if i2 = n then
      i
    else
      let nb, ne =
        if i2 > n then
          b, i
        else
          i, e
      if nb = b && ne = e then
        // Check i - 1 and i + 1 to see if either is a better fit than i
        let imin  = i - 1
        let imax  = i + 1
        let i2min = imin*imin
        let i2max = imax*imax
        let d     = n - i2    |> abs
        let dmin  = n - i2min |> abs
        let dmax  = n - i2max |> abs
        if d < dmin && d < dmax then
          i
        elif dmin < dmax then
          imin
        else
          imax

      else
        loop nb ne
  loop 1 n

open FsCheck

let isqrtProperty n =
  n > 1 ==> fun () ->
    let r     = isqrt n
    let rmin  = r - 1
    let rmax  = r + 1

    let r2    = r*r
    let rmin2 = rmin*rmin
    let rmax2 = rmax*rmax

    let d     = n - r2     |> abs
    let dmin  = n - rmin2  |> abs
    let dmax  = n - rmax2  |> abs

    r >= 0 && d <= dmin && d <= dmax

[<EntryPoint>]
let main argv =
  let config = { Config.Quick with MaxTest = 10000; MaxFail = 100000 }
  Check.One ("isqrt property", config, isqrtProperty)
  0

退一步:首先,您如何定义整数的平方根?8的平方根是多少?它应该是2.828的2层楼还是2.828的3层楼或2.828的3个数学圆?它没有很好的定义,根据您的应用程序,您可能需要选择其中一个选项。我还有一个问题:你为什么需要这个?或者你认为你为什么需要这个?因为我发现,当有人在没有解释他们为什么需要X的情况下要求X时,X是很难/不可能的,例如,整数的平方根函数,结果通常是他们真的想做Y,他们认为X是做Y的唯一方法。所以我们可以说,有另一种方法不做X就可以得到Y,看起来是这样的,这通常是一个比困难/不可能的X更好的解决方案。我确实希望对于一些测试,找到int类型的平方根。对于一些测试,比如一些家庭作业?出于好奇,不是每个问愚蠢问题的人都是愚蠢的