【问题标题】:Cutting corners with float-to-string representation?用浮点到字符串表示偷工减料?
【发布时间】:2021-01-13 06:02:32
【问题描述】:

我有一个浮点数,我需要将其转换为具有 5 个小数精度的字符串 (X.XXXXX),这意味着我需要至少有 6 个小数才能向上/向下舍入。问题是获取整数表示的操作会导致一个非常大的数字,我无法存储(我需要像 Big Integer 这样的东西,但出于兼容性原因我不能依赖任何内置的东西,我不会假装我理解如何以相当简单的方式重新发明一个)。我可以先发制人地限制它:

result = (m * Pow(5, +exp) / Pow(10,8));

但这只会为少数标准化浮点数(如0.3f1-E5113.754f(现在“ceil”部分有 3 个“前导”数字)等)给出正确的结果)将是错误的.

考虑到我需要最大 5 (6) 位小数精度 - 有没有捷径可以走?

【问题讨论】:

  • 什么语言?为什么具有所需宽度和精度的 printf 格式字符串不够用?
  • I cant relay on any built-in stuff,正如我所说(除了基本的数学运算和位移/二进制逻辑运算)。语言无关紧要,但在这种特殊情况下是 C#。
  • 'pow' 是内置的。为什么可以使用它?
  • 因为它的数学实现不会改变。就像加、减、除的实现一样。这跟我的问题有什么关系?
  • 关于“我需要至少 6 位小数才能向上/向下舍入”:有一位制表师想和你谈谈。

标签: c# floating-point


【解决方案1】:

有什么捷径可以走吗?

不是和是的。

不能获得最佳转换结果。快捷方式进入table-maker's dilemma。简而言之,将有一些特殊情况需要大量代码进行浮点到字符串的转换。通常这意味着使用整数数学进行大部分转换。 Example.

是的,如果代码愿意容忍一些错误。此错误是由浮点运算的累积舍入造成的。由于典型的浮点数具有 24 位二进制精度(类似于至少 6 个有效十进制数字),因此“5 个小数精度 (X.XXXXX)”(实际上是 6 个有效十进制数字)将很难在没有错误的情况下获得。

使用更广​​泛的数学可以大大减少错误(可能减少 1 亿倍),但不能消除错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2016-01-03
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多