【问题标题】:Fractional power of units of measures in F#F#中度量单位的分数幂
【发布时间】:2012-07-05 04:43:16
【问题描述】:

这样说是不是真的:F#中没有分数单位

【问题讨论】:

  • 是的。所以呢?您能否描述一个需要分数幂的用例?
  • 是的。我有一个'u'类型的矩阵。我需要进行 QR 分解。类型应该是 'u^1/2
  • 我不明白如何在没有分数幂的情况下创建单位系统。这是绝对基础的。
  • @pad 你有生产计量单位的代码吗?
  • 在分解中 Q 不是无量纲(无单位),R 与原始矩阵有相同的单位吗?

标签: f# units-of-measurement


【解决方案1】:

除了已经说过的内容之外,有关(不仅仅是)F# 度量单位的信息的最佳资源是Andrew Kennedy's PhD thesis,他实际设计了 F# 单位。他提到了分数单位:

最重要的决定是是否允许小数指数 的尺寸。反对他们的论据是哲学的:一个数量与 像 M1/2 这样的维度在物理上是没有意义的,如果出现这种情况,它 会建议修改一组基本尺寸,而不是重新评估 积分指数。赞成的论点是务实的:有时更容易 编写程序代码,临时创建一个值,其维数 分数指数。在本论文中,前一种观点占了上风,而分数 不考虑指数。然而,大多数理论只适用于 相同的;任何潜在的差异都会在出现时突出显示。

我认为这本质上是 F# 没有分数单位的原因,因为 F# 的设计非常接近 Andrew Kennedy 的工作,以确保它是合理的。

更新:在 F# 4.0 中,对小数指数的支持为 implemented

【讨论】:

  • 它确实没有物理意义。但是在抽象出算法时,就会遇到这样的情况。当然,由于它没有物理意义,因此这种分数功率单位最终会以一个提升到相应功率的单位来调用。因此,如果打算将小数单位用于一般目的,包括一般算法,那么使用小数单位真的很有意义
  • 我真的很想知道编译器的计算成本是多少。我想这可以忽略不计(所以这个问题实际上是哲学问题之一)
  • 这是一个非常有趣的链接。然后我会和肯尼迪先生争论——在读完他的论文之后
  • 其实,我已经通过他的网页(希望它通过)建议他将象征力量添加到计量单位。这对于处理矩阵运算维度检查分数功率问题的(在我的观点中是巨大的)情况具有巨大的优势。
  • 我坚持我之前的说法,“正确的概念是,一切以物理单位开始,以物理单位结束,但在同时,如果允许乘法,则必须闭合环,并添加小数单位......“。直到我长出更多的神经元。
【解决方案2】:

带有小数指数的单位很常见,它们并没有什么特别之处。 可能技术界的每个人都遇到过电压噪声密度,它是按每平方 (Hz) 测量的。 这在物理上很有意义,噪声功率与带宽成正比,噪声电压是功率的平方,这里没有奇怪的数学。

每次遇到分数幂指数时都创建一个新的基本单位不是正确的方法。

这些单位不是 SI 单位,它们的使用破坏了库的兼容性。 如果你将 sqrtHz 定义为一个新单位,而我定义了 rootHz,我们的代码就不能一起工作。 无论如何,我需要引入相当多的基础单元才能拥有完整的集合 赫兹^-2、赫兹^3、赫兹^-5、... 顺便说一句,仅仅提供理性指数似乎是更好的选择。 Boost.units 就是这样做的。

【讨论】:

  • 我什至会添加象征力量,因为我不明白为什么不这样做。实际上,这对奖励来说太过分了,所以我从我的代码中删除了它们。我很想毫不掩饰地添加它们,但这可能需要更深入的框架集成。现在,在简单的情况下,我在短程代码库中看到了它们的实际用途。也就是说,它们不太发光。
【解决方案3】:

字面意义上的fractional power 度量单位的缺失无论如何都不会打折 F# 单位设施,因为它允许以相反的方式呈现看似fractional exponent 单位关系,而将最小分数作为基本维度:

let takeSqrt (x: float<_>) = sqrt(x)

以这种方式推断float&lt;'u ^ 2&gt; -&gt; float&lt;'u&gt; 的签名,避免引入虚构的“自然分数”float&lt;'u&gt; -&gt; float&lt;'u^1/2&gt;

let moreComplicated (x: float<_>) (y: float<_>) =
    sqrt(x*x + y*y*y)

已推断出float&lt;'u ^ 3&gt; -&gt; float&lt;'u ^ 2&gt; -&gt; float&lt;'u ^ 3&gt; 的签名,其中所有单位度量转换相对于某些派生的隐式基本维度float&lt;'u&gt; 保持有效。

下面这段代码的事实

[<Measure>]type m
let c = sqrt(1.0<m>)

甚至没有与诊断一起编译 The unit of measure 'm' does not match the unit of measure ''u ^ 2' 可以被认为是责备或祝福,但清楚地表明单位测量检查已经到位。

【讨论】:

  • 我同意你的观点,但请注意,这意味着你不能调用takeSqrt 1.0&lt;s&gt;,因为返回类型没有整数幂。可以想象,在某些应用中,具有具体单位类型的分数幂会很有用。
  • @kvb:要么它具有物理意义并且值得定义一个派生的计量单位,要么没有这样的意义并且对于变量/绑定没有意义。
  • @bytebuster - 参见例如en.wikipedia.org/wiki/Fracture_toughness 是一个需要 m^1/2 的示例。当然,您可以创建派生单位,但无法用基本单位表示它是一个真正的限制,即使它在实践中相对罕见。
  • @kvb 我了解范围,但这对我来说很好(抱歉没有格式化):[&lt;Measure&gt;]type KIc [&lt;Measure&gt;]type Pa [&lt;Measure&gt;]type m = KIc^2/Pa^2 let pa:float&lt;Pa&gt; = 50.0&lt;KIc&gt; / sqrt 0.5&lt;m&gt;
  • @bytebuster - 如果您要定义一个新的派生 m 单元,则可以使用,但不适用于内置的 SI.m,这自然是可取的。
【解决方案4】:

编辑:在阅读了 OP 的评论和 Andrew Kennedy 的论文中的例外情况后,@nicolas 似乎是正确的——F# 不支持带小数指数的度量单位。

【讨论】:

  • 'u^1/2 单位不是 'u^-2。我仍然可能想做一个'u 类型的通用矩阵类,并有一些常用方法吐出单位'u^1/2,但没有限制我的类型有'u = 'v^2 for some'v
【解决方案5】:

答案不应该这么简单吗,是的,赫兹以 s^-2 为单位测量,与 s^(1/2) 相同?你去吧。 另外,我喜欢使用 的哲学思想,比如 m^(1/2) 如果它出现在计算中,也许有一天会理解这个单位的字面意义。

【讨论】:

  • 这里有个错误——s^-2=1/(s*s) 和 s^(1/2)=sqrt(s) 不一样
猜你喜欢
  • 2011-02-09
  • 2019-11-12
  • 2010-10-02
  • 1970-01-01
  • 2016-06-11
  • 2010-11-23
  • 2011-04-17
  • 2010-10-04
  • 2014-02-27
相关资源
最近更新 更多