【问题标题】:Modulo, float number模数,浮点数
【发布时间】:2010-12-28 08:26:41
【问题描述】:

如何对浮点数使用模?例如,如何找到结果

select power(cast(101 as float),50)%221

【问题讨论】:

  • -1 表示受到数学挑战,将 SQL Server 与 Windows 计算器进行比较。

标签: sql-server-2005 tsql floating-point modulo


【解决方案1】:

在某些情况下,可能需要对大数使用模,一种方法是使用小数(因为 int 和 bigint 可能太小)。

您必须自己实现模运算符 - 一种方法是:

SELECT (x/y-ROUND(x/y,0,1))*y

ROUND(x/y,0,1) 函数返回截断的x/y。例如,

(10.0/3 - ROUND(10.0/3,0,1))*3 = (3.333333-3)*3 = 1 

这在解决诸如 24840081102364802172700 mod 97 之类的大整数的模运算时很方便:

SELECT (CAST(24840081102364802172700 AS DECIMAL(23,0))/97 - ROUND(CAST(24840081102364802172700 AS DECIMAL(23,0))/97 ,0,1)) *97 = 10.0

最后你也可以完全四舍五入。

【讨论】:

    【解决方案2】:

    对于较小的数字,您必须转换为十进制

     select cast(power(cast(101 as float),50) as decimal(38,0)) % 221
    

     select power(cast(101 as decimal(38,0)),50) % 221
    

    虽然数量如此之大,但它失败了

    但是对于更大的数字来说无论如何都没有意义。

    • float 精确到 15 个有效数字。
    • 101 ^ 50 = 1.64463182184388E+100
    • 误差范围(浮点近似)比模 221 高大约 82 个数量级 (1E+82)

    任何取模的答案都是垃圾

    编辑:

    十进制约为 10^38

    在 10^39 或 1E+39 处取一个浮点数,然后您将精确到 1E24 左右(15 个重要数字)。

    你的模数是 221 = 2.2E+2

    您的误差范围即 1E+24/2.2E+2 = 4.4E+21

    为了 100% 清楚,您的准确度是模数的 4,400,000,000,000,000,000,000,000 倍。

    它甚至不是近似值:它是垃圾

    【讨论】:

    • 这只是一个例子。我可以有任何数字作为除数或除数。所以,我使用浮动。有什么方法可以将 % 应用于浮点数?
    • 不幸的是,我不能。我的数字可以大于小数的限制
    • @kkab:在这种情况下,你回到我的 cmets 关于误差范围。如果超过 1E38(十进制限制),则必须浮动。 221 大约是 2E2。例如,在 1E39 处,有 15 个 sig 数字 (1E15),您的数字准确度 (1E39-1E15 = 1E24) 和 2E2 之间的误差范围为 5E21。这是 5,000,000,000,000,000,000,000,000 的误差幅度,比 221 的除数大。所以你的模有 no 的含义。
    • 那么,你如何假设windows计算器是如何计算的?我得到了结果:power(101,50)%221=35
    • @kkab:“windows 计算器”不是“SQL Server”。它不会使用“浮动”。我相信谷歌会告诉你它是如何在某个地方完成的。
    【解决方案3】:

    如果 SQL Server 支持,mod 函数应该处理浮点数。但是您显示的计算,浮点数将无法提供足够的精度。当你离开演员阵容时会发生什么?

    【讨论】:

    • 它会爆炸:结果只适合浮动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多