【问题标题】:Base 2 logarithm in F#F# 中以 2 为底的对数
【发布时间】:2015-01-16 13:11:54
【问题描述】:

F# 语言具有计算自然对数的函数 log 和计算以 10 为底的对数的函数 log10。

在 F# 中计算以 2 为底的对数的最佳方法是什么?

【问题讨论】:

    标签: f#


    【解决方案1】:

    您可以简单地使用“b 的 a 对数”= ln(b) / ln(a) 的事实,即 x 的 2 对数是 ln(x) / ln(2)。

    log2(8)  = ln(8)  / ln(2) = 3
    log2(32) = ln(32) / ln(2) = 5 
    

    ...其中ln 是自然对数或log10,对数都可以。

    【讨论】:

    • 我希望我能接受你和 Gustavo 的答案,因为它们都有效。然而,我选择了这个答案,因为它仅依赖于 FSharp.Core 中的例程(在 FSharp.Core.dll 中),而 Gustavo 引入了对 System 的依赖以及可能的对数的替代定义。
    • @JonnyBoats 不用担心,但是“对系统的依赖”是什么意思?你能不依赖它吗?
    • Gustavo,无论出于何种原因,f# 语言团队都选择在 FSharp.Core.dll 中实现对数函数,而不是在 System (msdn.microsoft.com/en-us/library/ee353819.aspx) 中使用标准的 .Net 函数。我不知道为什么,也许我所知道的代码是相同的。由于 f# 是一种开放语言,因此有人可能会在某些操作系统(如 Mono)上执行不同的实现。
    • @JonnyBoats 他们这样做是为了提供对某些类型具有多态性的即用型函数(而不是方法),Math 方法通过重载实现相同的功能,但是有一些方法(如 Log ) 具有不同的重载(不仅仅是不同的类型),因此在某些情况下,您必须使用所需的重载调用 Math 方法。关于依赖关系,您可以在不同的操作系统上实现 F#,但这并不意味着您必须更改 System 命名空间的公共接口。
    【解决方案2】:

    使用System.Math.Log(number, base)

    例子:

    open System
    Math.Log(32., 2.)
    val it : float = 5.0
    

    【讨论】:

    • +1 这当然比我的解决方案更容易。不知道那个功能:)
    • @JoachimIsaksson,实际上 Log(double, double) 的 MS 实现完全符合您在回答中所说的。
    【解决方案3】:

    从 .NET 5.0 开始有Math.Log2

    > Math.Log2 64;;
    6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多