gpt4 book ai didi

floating-point - 如何用 double 模拟单精度舍入?

转载 作者:行者123 更新时间:2023-12-03 14:56:46 25 4
gpt4 key购买 nike

我在尝试重建现有系统中使用的公式时遇到了一个问题,这是一个相当简单的一个输入和一个输出的公式:

y = f(x)

经过一番百思不得其解, we 设法找出了适合我们观察到的数据点的公式:

enter image description here

正如您所看到的,我们的理论模型非常适合观察到的数据:

enter image description here

除了绘制残差(即 y = f(x) - actualY )时,我们看到残差中出现了一些行:

enter image description here

很明显,这些线是在我们的公式中应用一些中间舍入的结果,但不清楚在哪里。最终意识到 原始 系统(我们正在尝试逆向工程的系统)将值存储在中间 Decimal 数据类型中:
  • 8 位精度 的分数
  • 使用 0.5 舍入 舍入模型:

  • 我们可以通过以下方式模拟分数中的这个 8 位精度:
    multiply by 128 (i.e. 2^8)
    apply the round
    divide by 128 (i.e. 2^8)

    将我们上面的等式改为:

    enter image description here

    这显着减少了残差:

    enter image description here

    现在,以上所有内容都与我的问题无关,除了:
  • 表明在计算机中模拟数值表示可以帮助模型
  • 用漂亮的图片和颜色来吸引人们的注意力
  • 沉默批评 would refusecontribute 直到​​我 explain 为什么我问我的问题


  • 现在我想在使用 Single Precision 浮点数的编程语言(和 Excel)中模拟 Double Precision 浮点数。我想这样做是因为我 认为 这是所需要的。

    在上面的例子中,我 认为 原始系统使用的是 Decimal data type with fixed 8-bit fractional precision using 0.5 round-up rules 。然后我必须找到一种方法来使用 Double 数学来模拟该计算模型。现在我认为原始系统正在使用 Single 精度数学,我想使用 Double 进行模拟。

    How do i simulate single-precision rounding using doubles?



    在我当前的模型中,我再次得到了属于常规线性模式的残差 - 这是四舍五入的迹象:

    enter image description here

    问题是当我的输入变量变大时,误差会变大,而且只有可见。我意识到这可能是由于所有浮点数都被归一化为 IEEE 754 “科学记数法”这一事实造成的。

    即使我错了,我仍然想尝试一下。

    即使我不想尝试,我仍然在问这个问题

    How do i simulate Single precision rounding using Doubles?



    在我看来,我仍然可以应用“在 8 个小数位后舍入”的概念(尽管 Single 精度浮点数为 24 位),只要我可以先“规范化”该值。例如
    1234567898.76543

    需要转换成(类似于):
    1.23456789876543 E-09

    然后我可以将我的“舍入到第 24 位”(即 2^24 = 16,777,216)
    floor(1.23456789876543E-09 * 16777216 + 0.5) / 16777216;

    那么,问题是我可以应用 signabslnexp (或其他函数)的什么组合,以便我可以“规范化”我的值,将其四舍五入到第 n 个二进制位置,然后“非规范化”它?

    注意 :我意识到 IEEE 表示将二进制 1 作为最高有效位。我可能不需要复制该行为以获得正确的结果。因此,这不是交易破坏者,也不是暗示整个方法失败的原因。

    也可以看看
  • How to emulate single precision float operations in PHP?
  • Simulate single precision arithmetic in Matlab?
  • IEEE 754 Floating Point
  • 最佳答案

    您想使用库函数 frexp 和 ldexp,它们是标准的 C99 函数,在 Lua 中可用。

    frexp 采用浮点数并将尾数与指数分开。得到的尾数要么是 0,要么在 [0.5, 1.0) 或 (-1.0, 0.5] 范围内的一个。然后你可以用明显的方式删除任何额外的位(例如,floor(mantissa * 2^k)/2^k 用于非负值)。 (编辑添加:)从调用 ldexp 的指数中减去 k 比如图所示进行除法要好,因为我很确定 Lua 不保证 2^k 是精确的。

    ldexp 是 frexp 的倒数;您可以使用它再次将截断的数字重新组合在一起。

    我不知道如何在 Excel 中执行此操作。检查手册:)(编辑添加:) 我想你可以通过将数字除以 2 到数字的对数 2 的上限的幂,然后按照上面所示进行二进制舍入来获得大致相同的效果,然后反转该过程以重新创建原始指数。但我怀疑结果有时会因 Excel 对算术的奇特想法而产生奇特之处。

    关于floating-point - 如何用 double 模拟单精度舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553136/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com