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

相关推荐
小北方城市网2 分钟前
GEO 全场景智能生态:自适应架构重构与极限算力协同落地
开发语言·人工智能·python·重构·架构·量子计算
科技小E2 分钟前
EasyGBS算法算力平台重构服务业视频监控AI应用
人工智能·重构·音视频
乐迪信息3 分钟前
乐迪信息:防止船舶误入禁航区:AI偏航检测精准干预
大数据·运维·人工智能·物联网·安全
AI_56784 分钟前
从“数学小白”到“独立做项目”——3阶段学习法如何让零基础学好AI
人工智能·学习
q_30238195565 分钟前
香橙派AI Pro 20T部署DeepSeek:打造本地离线语音助手,实现语音交互自由!
人工智能·交互
极新5 分钟前
AI 重构科研范式:机遇已至,挑战何解?| 2025 极新 AIGC 峰会圆桌论坛实录
人工智能
AI架构师易筋8 分钟前
ReAct(react_agent)从入门到严谨:并以 AIOps 离线 PoC 为例给出可落地方案
人工智能·react
sww_102611 分钟前
Spring AI Structured-Output源码分析
java·人工智能·spring
Blossom.11811 分钟前
工业级扩散模型优化实战:从Stable Diffusion到LCM的毫秒级生成
开发语言·人工智能·python·深度学习·机器学习·stable diffusion·transformer