【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。

相关推荐
世岩清上20 分钟前
AI驱动的智能运维:从自动化到自主化的技术演进与架构革新
运维·人工智能·自动化
K2_BPM22 分钟前
告别“单点智能”:AI Agent如何重构企业生产力与流程?
人工智能
TMT星球24 分钟前
深业云从人工智能产业投资基金设立,聚焦AI和具身智能相关产业
人工智能
鼾声鼾语44 分钟前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
Dingdangcat861 小时前
中药材图像识别与分类 RetinaNet-R101-FPN模型详解
人工智能·数据挖掘
老蒋新思维1 小时前
创客匠人视角:智能体重构创始人 IP,知识变现从 “内容售卖” 到 “能力复制” 的革命
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现
Honmaple2 小时前
Spring AI 2.x 发布:全面拥抱 Java 21,Redis 史诗级增强
java·人工智能·spring
古城小栈2 小时前
区块链 + AI:医疗诊断模型存证上链技术实践与探索
人工智能·区块链
丹宇码农2 小时前
Index-TTS2 从零到一:完整安装与核心使用教程
人工智能·ai·tts
AKAMAI2 小时前
Akamai Cloud客户案例 | IPPRA的简洁、经济、易用的云计算服务
人工智能·云计算