【Clickhouse】float 计算误差

Float 为二进制 精度有损,每次求和的结果可能一样,由于相加顺序不一样导致。

bigDecimal是无损的,底层为十进制,但是存储占用更大。

举例:

SELECT 0.1 + 0.2 AS result

在 ClickHouse 中,运行上述查询,可能会得到一个结果接近于 0.3,但不完全相等的值,例如 0.30000000000000004。这是因为浮点数的二进制表示无法完全精确地表示 0.1 和 0.2。

浮点数误差来源

浮点数中的舍入误差是由以下几个因素造成的:

  • 有限的二进制表示:浮点数使用有限的二进制位数来表示实数。由于二进制无法精确表示一些十进制小数,例如 0.1 或 0.3,转换为二进制时会导致舍入误差。

  • 舍入模式:浮点数计算中的舍入模式决定了如何处理舍入误差。常见的舍入模式有四舍五入、向上取整、向下取整等。不同的舍入模式可能会导致不同的舍入误差。

  • 累积的舍入误差:在复杂的计算中,多个浮点数的运算会导致舍入误差的累积。由于浮点数的有效位数有限,累积的舍入误差可能会导致结果的微小差异。

  • 计算顺序:浮点数计算的顺序也可能影响舍入误差。由于浮点数的运算不满足交换律和结合律,不同的计算顺序可能会产生不同的舍入误差。

综上所述,浮点数中的舍入误差是由于有限的二进制表示、舍入模式、累积的舍入误差和计算顺序等因素的综合作用所造成的。这些因素使得浮点数的计算结果在某些情况下无法精确表示实数,从而引入了舍入误差。

0.8 转换为二进制小数

将十进制数 0.8 转换为二进制小数时,可以得到以下结果:

0.8 的二进制表示为 0.110011001100110011001100110011...(无限循环)。

转换过程如下:

将 0.8 乘以 2,得到 1.6。整数部分为 1,小数部分为 0.6。

将 0.6 乘以 2,得到 1.2。整数部分为 1,小数部分为 0.2。

将 0.2 乘以 2,得到 0.4。整数部分为 0,小数部分为 0.4。

将 0.4 乘以 2,得到 0.8。整数部分为 0,小数部分为 0.8。

重复上述步骤,得到的小数部分会无限循环下去:0.110011001100110011001100110011...

这个转换过程显示了 0.8 的二进制表示是一个无限循环的二进制小数。然而,由于计算机浮点数的存储和精度限制,无法精确地表示这个无限循环的二进制小数。因此,在实际计算中,计算机会使用一个近似值来存储和处理 0.8,可能会导致微小的舍入误差。

二进制数转换为小数

将二进制数转换为小数的规则如下:

  • 将二进制数的每一位按权重展开,权重从左到右依次为 20、2(-1)、2(-2)、2(-3) 等。
  • 将每一位的权重与对应的二进制位相乘,并将结果相加,得到对应的小数值。
    具体步骤如下:
  1. 将二进制数的整数部分从左到右依次乘以 2 的幂,幂值从 0 开始递增。
  2. 将二进制数的小数部分(如果有)从左到右依次乘以 2 的负幂,幂值从 -1 开始递减。
  3. 将上述计算得到的结果相加,得到对应的小数值。

需要注意的是,对于无限循环的二进制数,转换为小数时可能无法精确表示,因为计算机浮点数的存储和精度是有限的。在实际计算中,可能会使用一个近似值来表示。

下面是一个示例,将二进制数 0.101 转换为小数:

复制代码
0.101 转换为小数 = 
(1 * 2^(-1)) + (0 * 2^(-2)) + (1 * 2^(-3)) = 0.5 + 0 + 0.125 = 0.625

因此,0.101 的二进制数表示为 0.625。

相关推荐
飞哥数智坊10 小时前
GPT-5-Codex 发布,Codex 正在取代 Claude
人工智能·ai编程
倔强青铜三10 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
虫无涯11 小时前
Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
人工智能
Dm_dotnet13 小时前
公益站Agent Router注册送200刀额度竟然是真的
人工智能
算家计算13 小时前
7B参数拿下30个世界第一!Hunyuan-MT-7B本地部署教程:腾讯混元开源业界首个翻译集成模型
人工智能·开源
机器之心14 小时前
LLM开源2.0大洗牌:60个出局,39个上桌,AI Coding疯魔,TensorFlow已死
人工智能·openai
Juchecar15 小时前
交叉熵:深度学习中最常用的损失函数
人工智能
林木森ai15 小时前
爆款AI动物运动会视频,用Coze(扣子)一键搞定全流程(附保姆级拆解)
人工智能·aigc
聚客AI15 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
BeerBear17 小时前
【保姆级教程-从0开始开发MCP服务器】一、MCP学习压根没有你想象得那么难!.md
人工智能·mcp