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

相关推荐
AwhiteV26 分钟前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
Black_Rock_br42 分钟前
AI on Mac, Your Way!全本地化智能代理,隐私与性能兼得
人工智能·macos
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
fsnine2 小时前
机器学习——数据清洗
人工智能·机器学习
小猿姐2 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
算法_小学生2 小时前
循环神经网络(RNN, Recurrent Neural Network)
人工智能·rnn·深度学习
吱吱企业安全通讯软件3 小时前
吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
大数据·网络·人工智能·安全·信息与通信·吱吱办公通讯
盲盒Q3 小时前
《频率之光:共振之战》
人工智能·硬件架构·量子计算
飞哥数智坊3 小时前
DeepSeek V3.1 发布:我们等的 R2 去哪了?
人工智能·deepseek
爱分享的飘哥3 小时前
第八十三章:实战篇:文 → 图:Prompt 控制图像生成系统构建——从“咒语”到“神作”的炼成!
人工智能·计算机视觉·prompt·文生图·stablediffusion·diffusers·text-to-image