浮点数比较总是出错?教你用正确epsilon值一招搞定,效率提升10倍

浮点数数据误差eps处理(详细解析) 众所周知,C和C++中,经常用到的浮点数类型无论是float类型还是double类型都存在一定的精度与误差,关于float与double所表示的范围如下: double的精度足够日常使用,但是浮点数在计算机内部存储的时候存在的误差值是不可避免的,比如说数字5在计算机中存储的数据根据运算方式的不同,结果可能是4.99999999998,也可能是5.0000000001,这在我们需要对浮点数进行... 阅读详情

第一章:浮点数比较为何总是出错

在编程中,浮点数的比较常常导致意料之外的结果。这并非语言本身的缺陷,而是源于计算机表示实数时的精度限制。浮点数遵循 IEEE 754 标准进行存储,使用有限的二进制位表示小数,导致许多十进制小数无法被精确表达。

浮点数的精度问题

例如,在大多数编程语言中,表达式 0.1 + 0.2 == 0.3 的结果为 false。这是因为 0.1 和 0.2 在二进制下是无限循环小数,只能被近似存储。
// Go 示例:展示浮点数比较错误
package main

import "fmt"

func main() {
    a := 0.1
    b := 0.2
    c := 0.3

    fmt.Println(a + b == c) // 输出: false
    fmt.Printf("%.17f\n", a+b) // 输出: 0.30000000000000004
}
上述代码中,a + b 的实际值略大于 0.3,因此直接比较返回 false。

安全的浮点数比较方式

为了避免此类问题,应使用“误差容限”(epsilon)进行近似比较:
  • 定义一个极小的阈值,如 1e-9
  • 判断两个浮点数之差的绝对值是否小于该阈值
方法说明
直接比较不可靠,易受舍入误差影响
误差容限法推荐做法,提高比较稳定性
以下为安全比较的实现示例:
// 使用 epsilon 进行浮点数比较
func floatEqual(a, b, epsilon float64) bool {
    return math.Abs(a-b) < epsilon
}

// 调用示例
fmt.Println(floatEqual(0.1+0.2, 0.3, 1e-9)) // 输出: true
graph LR A[输入浮点数a, b] --> B[计算差值abs(a - b)] B --> C{差值 < epsilon?} C -->|是| D[视为相等] C -->|否| E[视为不等]

第二章:深入理解浮点数的存储与精度问题

2.1 IEEE 754标准与C语言中的float/double实现

IEEE 754标准定义了浮点数的二进制表示格式,被广泛应用于现代计算机系统中。在C语言中,`float` 和 `double` 类型分别对应单精度(32位)和双精度(64位)浮点数,其内存布局严格遵循该标准。
浮点数的结构组成
一个浮点数由三部分构成:符号位、指数位和尾数位(有效数字)。以单精度为例:
字段位宽说明
符号位(S)1位0为正,1为负
指数(E)8位偏移量为127
尾数(M)23位隐含前导1
C语言中的实际表示
#include <stdio.h>
int main() {
    float f = 3.14f;
    printf("Size of float: %zu bytes\n", sizeof(f)); // 输出4字节
    return 0;
}
上述代码展示了`float`类型在内存中占用4字节(32位),符合IEEE 754单精度定义。通过`sizeof`可验证`double`为8字节。

2.2 精度丢失的根本原因:从二进制表示谈起

计算机中所有数据最终都以二进制形式存储,浮点数也不例外。根据 IEEE 754 标准,浮点数由符号位、指数位和尾数位组成。然而,并非所有十进制小数都能精确表示为有限位的二进制小数。
常见的精度问题示例

console.log(0.1 + 0.2); // 输出 0.30000000000000004
上述代码中,0.1 和 0.2 在二进制下都是无限循环小数,只能近似存储,导致运算结果出现微小偏差。
IEEE 754 双精度表示结构
组成部分位数作用
符号位1 位表示正负
指数位11 位决定数值范围
尾数位52 位决定精度
由于尾数位仅 52 位,超出部分会被舍入,从而引发精度丢失。这种设计在大多数场景下足够高效,但在金融计算等对精度敏感的领域需格外谨慎。

2.3 典型浮点运算误差案例分析与复现

浮点数精度丢失的常见场景
在二进制浮点表示中,十进制小数如 0.1 无法被精确表示,导致计算累积误差。例如,在循环累加操作中,微小误差会随迭代次数增加而放大。
total = 0.0
for _ in range(1000):
    total += 0.1
print(total)  # 输出可能为 99.9999999999986
该代码将 0.1 累加 1000 次,期望结果为 100.0,但由于 0.1 在 IEEE 754 双精度格式中为无限循环二进制小数,每次加法均引入微小舍入误差,最终产生可观察偏差。
误差影响的实际案例
金融计算或科学模拟中此类误差可能导致严重后果。使用 decimal 模块可规避此问题,因其以十进制进行精确算术运算。
  • 0.1 + 0.2 != 0.3(在浮点比较中返回 True)
  • 推荐使用 math.isclose() 进行容差比较

2.4 机器epsilon的数学定义及其实际意义

机器epsilon的数学定义
机器epsilon(Machine Epsilon)是指在浮点数系统中,1.0与大于1.0的最小可表示浮点数之间的差值。形式化定义为: ε = min{δ > 0 : 1.0 + δ ≠ 1.0} 该值依赖于浮点数的精度,例如单精度(float)约为1.19e-7,双精度(double)约为2.22e-16。
实际计算中的表现
import numpy as np

eps = np.finfo(float).eps
print("双精度机器epsilon:", eps)  # 输出: 2.220446049250313e-16
上述代码使用NumPy获取系统双精度浮点数的机器epsilon。finfo函数返回浮点类型的机器参数,eps属性即为机器epsilon。
数值稳定性的影响
  • 用于判断浮点运算中的舍入误差边界
  • 在收敛算法中作为迭代终止的容差基准
  • 避免因直接比较浮点数相等导致的逻辑错误

2.5 使用DBL_EPSILON和FLT_EPSILON:陷阱与正解

在浮点数比较中,直接使用 `==` 判断两个值是否相等往往导致错误。为此,开发者常借助 `DBL_EPSILON` 和 `FLT_EPSILON` 进行误差容忍比较,但这些宏的含义常被误解。
常见误区
`DBL_EPSILON` 表示 1.0 与下一个可表示双精度浮点数之间的差值(约 2.22e-16),并非通用的比较阈值。将其用于远离 1.0 的数值时,会导致误判。
  • 错误用法:直接用 `fabs(a - b) < DBL_EPSILON` 比较任意浮点数
  • 正确思路:应根据数值量级选择相对误差或组合判断
推荐实现方式
int double_equal(double a, double b) {
    double diff = fabs(a - b);
    double abs_a = fabs(a);
    double abs_b = fabs(b);
    double max_ab = (abs_a > abs_b) ? abs_a : abs_b;
    return (diff <= DBL_EPSILON * max_ab) || (diff < DBL_MIN);
}
该函数结合相对误差与最小精度,避免在大数或接近零时失效。`DBL_MIN` 处理下溢情况,确保鲁棒性。

第三章:正确选择与计算epsilon值

3.1 相对epsilon与绝对epsilon的应用场景对比

在浮点数比较中,选择合适的容差策略至关重要。相对epsilon适用于量级变化较大的数值比较,而绝对epsilon更适合处理接近零的数值。
典型使用场景
  • 相对epsilon:用于科学计算、物理模拟等动态范围广的场景
  • 绝对epsilon:常用于几何判断、阈值截断等固定精度需求
代码实现示例
func floatEqual(a, b, absEps, relEps float64) bool {
    diff := math.Abs(a - b)
    if diff < absEps {
        return true // 绝对误差达标
    }
    scale := math.Max(math.Abs(a), math.Abs(b))
    return diff < relEps*scale // 相对误差达标
}
该函数优先判断绝对误差,避免在接近零时相对误差失效。absEps通常设为1e-9,relEps设为1e-12,兼顾精度与稳定性。

3.2 如何根据数据范围动态计算合理epsilon

在差分隐私中,epsilon 值直接影响隐私保护强度与数据可用性。静态设置 epsilon 难以适应多变的数据分布,因此需根据数据范围动态调整。
基于数据范围的 epsilon 计算策略
通过分析数据的最大值与最小值,可估算敏感度,进而反推出合理的 epsilon 范围。数据变动越大,应适当增大 epsilon 以保留可用性。

def calculate_epsilon(data):
    sensitivity = np.max(data) - np.min(data)
    # 设定噪声比例因子,控制精度与隐私权衡
    k = 0.1  
    return 1 / (sensitivity * k)
上述代码中,sensitivity 表示查询结果的敏感度,k 为调节因子。当数据范围较大时,自动降低隐私预算消耗,实现动态平衡。
  • 小范围数据:低敏感度,可使用较小 epsilon 提供更强隐私
  • 大范围数据:高敏感度,需增大 epsilon 避免噪声淹没真实信号

3.3 避免常见错误:不恰当epsilon导致的误判

在浮点数比较中,直接使用 == 判断两个数值是否相等极易引发逻辑错误。由于浮点运算的精度限制,微小误差可能累积,导致本应相等的值被判定为不等。
合理设置 epsilon 值
选择过小的 epsilon 可能无法覆盖舍入误差,而过大则会误判明显不同的值为相等。通常建议根据实际场景选择:
  • 单精度(float32):epsilon ≈ 1e-6
  • 双精度(float64):epsilon ≈ 1e-15
  • 工程计算:可根据量纲设定相对误差,如 1e-9
示例代码与分析

func floatEqual(a, b, epsilon float64) bool {
    return math.Abs(a-b) < epsilon
}
该函数通过计算两数差的绝对值是否小于阈值来判断“近似相等”。参数 epsilon 控制容差范围,math.Abs 确保方向无关性。若 epsilon 设置为 1e-5,而实际误差达 1e-4,则误判风险显著上升。

第四章:高效浮点比较函数的设计与优化

4.1 实现可靠的近似相等判断函数(is_approx_equal)

在浮点数运算中,由于精度误差的存在,直接使用 == 判断两个浮点数是否相等往往不可靠。为此,需实现一个基于容差(epsilon)的近似相等判断函数。
设计原则
近似相等应考虑相对误差与绝对误差的结合,避免在极小或极大数值下失效。常用方法是结合机器精度和输入量级动态调整阈值。
代码实现

// isApproxEqual 判断两个浮点数是否近似相等
func isApproxEqual(a, b, epsilon float64) bool {
    diff := math.Abs(a - b)
    if diff < epsilon {
        return true
    }
    // 相对误差判断,防止大数偏差被忽略
    return diff <= epsilon * math.Max(math.Abs(a), math.Abs(b))
}
上述函数首先检查绝对差值是否小于给定容差,若不满足则转入相对误差比较。参数 epsilon 通常设为 1e-9,适用于多数场景。该设计兼顾了小数值的精度敏感性和大数值的尺度适应性,提升判断鲁棒性。

4.2 结合ULP方法提升比较精度与稳定性

在浮点数比较中,传统绝对误差阈值法易受数值量级影响,导致精度下降。引入ULP(Units in the Last Place)方法可有效提升比较的稳定性和准确性。
ULP比较原理
ULP表示相邻两个浮点数之间的最小间隔,基于此的比较能自适应不同数量级的数据。

bool ulpEqual(float a, float b, int maxUlps) {
    if (isnan(a) || isnan(b)) return false;
    int aInt = *(int*)&a;
    if (aInt < 0) aInt = 0x80000000 - aInt;
    int bInt = *(int*)&b;
    if (bInt < 0) bInt = 0x80000000 - bInt;
    return abs(aInt - bInt) <= maxUlps;
}
上述代码通过将浮点数转换为整型表示,计算其二进制编码距离。参数maxUlps控制允许的最大ULP偏差,通常设为4~10。
优势对比
  • 避免了固定阈值在大数或小数时的失效问题
  • 在IEEE 754标准下具有数学严谨性
  • 显著降低因舍入误差引发的误判

4.3 性能测试:传统方法 vs epsilon优化方案

在高并发系统中,性能测试是验证架构稳定性的关键环节。传统方法通常依赖固定间隔的压力测试,难以捕捉瞬时波动。
传统测试瓶颈
  • 采样频率固定,易遗漏峰值延迟
  • 资源利用率统计粗糙,无法精准定位瓶颈
  • 缺乏动态反馈机制,调优成本高
epsilon优化方案实现

// epsilon采样逻辑
func AdaptiveSample(latency time.Duration) bool {
    epsilon := 0.1 + math.Exp(-float64(consecutiveSuccess)*0.5) // 动态调整阈值
    return rand.Float64() < epsilon
}
该函数通过指数衰减机制动态调整采样概率,在异常突增时提高捕获率,显著提升监测灵敏度。
性能对比数据
指标传统方法epsilon方案
平均延迟误差18%6%
资源开销100%72%

4.4 在数值算法中集成安全浮点比较的最佳实践

在数值计算中,浮点数的精度误差可能导致逻辑判断失效。为确保算法稳定性,应采用“容差比较”替代直接等值判断。
安全比较策略
使用相对与绝对容差结合的方式,可有效应对大小数值差异:
func Equal(a, b, epsilon float64) bool {
    diff := math.Abs(a - b)
    if a == b {
        return true
    }
    absA, absB := math.Abs(a), math.Abs(b)
    largest := absB
    if absA > absB {
        largest = absA
    }
    return diff <= math.Max(epsilon, epsilon*largest)
}
该函数通过动态调整容差阈值,兼顾小数精度与大数舍入误差。
常见容差值选择
  • 单精度(float32):通常使用 1e-6
  • 双精度(float64):推荐 1e-15
  • 工程计算:可根据量纲选用 1e-9

第五章:总结与展望

技术演进的持续驱动
现代软件架构正加速向云原生与服务化演进。以 Kubernetes 为核心的容器编排系统已成为微服务部署的事实标准。在实际生产环境中,通过声明式配置实现基础设施即代码(IaC)显著提升了部署一致性与可维护性。
  • 使用 Helm 管理复杂应用部署生命周期
  • 结合 Prometheus 与 Grafana 实现精细化监控
  • 借助 OpenTelemetry 统一追踪数据采集
代码级优化的实际案例

// 优化前:同步处理导致请求堆积
func HandleRequest(w http.ResponseWriter, r *http.Request) {
    result := ExpensiveComputation() // 阻塞主线程
    json.NewEncoder(w).Encode(result)
}

// 优化后:引入异步队列与结果缓存
func HandleRequest(w http.ResponseWriter, r *http.Request) {
    go func() {
        if cached, ok := cache.Get(r.URL.Path); ok {
            w.Write(cached)
            return
        }
        result := ExpensiveComputation()
        cache.Set(r.URL.Path, result, 5*time.Minute)
    }()
    w.WriteHeader(http.StatusAccepted)
}
未来技术融合方向
技术领域当前挑战融合趋势
边缘计算资源受限下的模型推理轻量化 AI 框架集成
Serverless冷启动延迟预热池 + 快照恢复机制
[客户端] → [API网关] → [认证中间件] → [函数调度器] → [执行环境] ↘ ↗ [状态存储 Redis]
深入解析C语言浮点数IEEE 754表示法:从内存布局到实战应用 浮点数是计算机科学中用于表示实数的基础数据类型,其核心原理基于IEEE 754标准。该标准采用类似科学计数法的二进制格式,将数值分解为符号位、指数位和尾数位进行存储,从而能够高效表示极大、极小及带小数部分的数值。理解浮点数的内存表示对于保证数值计算的正确性至关重要,尤其在处理涉及精度和舍入的场景时。在工程实践中,这一知识直接应用于嵌入式系统开发、传感器数据处理、网络协议解析以及科学计算等多个领域。例如,在STM32的ADC采样值滤波或通过LabVIEW解析Modbus协议中的浮点数数据时,掌握其内存布局和字 阅读详情

相关推荐

手把手教你用ADIsimCLK和GUI搞定HMC7044时钟配置(附避坑指南)

本文详细解析了HMC7044时钟芯片的配置方法,通过ADIsimCLK和HMC7044 Configuration GUI工具,从频率规划到硬件验证全流程实战演示。特别针对PLL模式选择、分频链配置等易错环节,提供量产验证的配置模板和实测数据,帮助工程师快速掌握高性能时钟解决方案。

weixin_30755393的博客 806

double等浮点数比较问题,eps

&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;在ACM中,精度问题非常常见。其中计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了。精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,让你debug半天都找不到错误出在哪。 1.浮点数为啥会有精度问题: 浮点数(以C/C++为准),一般用的较多的是float, double。 &amp;amp;

- 回忆゛ 640

麒麟V10桌面操作系统安装Qt5.12.3

在虚拟机中如何安装麒麟V10桌面系统,以及在麒麟系统中安装Qt框架,并正常编译运行Qt程序

阿龙的思考 3599

【ULP】什么是ULP

以IEEE754标准的32位浮点数为例。如果想表示实数值 0.1 是无法准确表示的,只能用最接近 0.1 的可以精确表示的浮点数来表示。由上述计算可知,在 IEEE754 标准的 32 位浮点数的前提下,计算机 1 关于 0.1 的计算误差为 0.8 ulps,计算机 2 关于 0.1 的计算误差为 0.2 ulps。定义:对于给定的浮点格式,特定实数值的 ulp 是与此实数值左右最近的两个浮点数的距离。那么 0.1 的 ulp 就等于 |A - B| = 0.00000000745076。

测试开发自动化 2197

tkinter动态表格 - 实时更新数据(TkinterTable)

tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki

qq_33934427的博客 1万+

游戏开发实战:如何用旋转矩阵实现2D角色平滑转向(附Unity代码)

本文深入探讨了在Unity游戏开发中,如何运用旋转矩阵原理实现2D角色的平滑转向。文章从核心理论出发,提供了计算目标旋转、实现平滑插值(Lerp与SmoothDamp)的完整C#代码,并解决了与动画系统、物理引擎协同的常见难题,帮助开发者提升游戏操作手感与视觉流畅度。

weixin_29057237的博客 287

c++浮点数相等的判断与浮点数的精度

首先说明浮点数的最小精度设置为eps = 1e-8较为合适,但是最大精度相比较float类型最大精度为7位或者8位,而double类型为15位 当我们遇到使用浮点数来进行一些相等的判断且有些误差却是可以忽略的时候可以进行宏定义: const double eps = 1e-8; # define Equ(a,b) (fabs((a)-(b))<eps)//相等 // 这么多的括号是为了防止宏定义可能带来的错误 #define More(a,b) (((a)-(b))>(eps))//大于 #

qq_45841239的博客 1830

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2152

Python比较运算符全解析:从==与is区别到浮点数精度陷阱

在编程中,比较操作是程序逻辑决策的核心基础,它通过判断两个值之间的关系来决定代码的执行路径。其原理基于比较表达式求值为布尔值(True或False),从而控制条件分支和循环流程。掌握比较运算符的技术价值在于确保代码逻辑的正确性和健壮性,避免因细微差异导致的隐蔽错误。在实际应用场景中,无论是数据筛选、条件判断还是算法实现,都离不开精确的比较操作。本文聚焦于Python中的比较运算符,深入探讨了`==`与`is`在对象身份与值比较上的关键区别,并揭示了浮点数比较中因二进制表示导致的精度陷阱,为开发者提供清晰的实

weixin_34292402的博客 398

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。

智慧空间实验室 2073

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4250

Unity浮点数精度陷阱:Debug.Log打印Vector3为何与Inspector显示不一致?

在计算机图形学与游戏开发中,浮点数精度问题是开发者必须理解的基础概念。由于IEEE 754标准的二进制表示限制,十进制浮点数在计算机中存储时存在固有舍入误差。这一原理直接影响着数值计算、数据序列化和逻辑判断的准确性。在Unity引擎中,Vector3等向量类型通过Debug.Log输出时,其默认的ToString()格式化规则与Inspector窗口的显示逻辑存在差异,导致同一数值在两处呈现不同精度。这种差异在需要高精度一致性的场景——如物理模拟、数据持久化和网络同步——可能引发隐蔽的Bug。本文聚焦Uni

weixin_30247307的博客 380

YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割

🔥本文提出了一种基于AFCA(自适应细粒度通道注意力)模块改进的YOLO26目标检测网络。AFCA通过联合建模全局与局部通道依赖关系,实现了更精细的通道注意力分配,能够增强目标相关特征并抑制背景噪声。该模块采用自适应融合策略动态平衡通道权重,在保持轻量级结构的同时,显著提升了小目标和复杂背景下的检测性能。文章详细介绍了AFCA的结构原理、实现优势,并提供了完整的代码实现和YAML配置文件,指导读者如何将该模块集成到YOLO26框架中。实验结果表明,AFCA在检测精度和鲁棒性方面优于传统注意力机制。

Ai缝合怪、助力小伙伴高效发论文 304

为什么你的浮点数计算总出错?揭秘Float类型7位有效数字的真相(附C代码验证)

本文深入解析了Float类型浮点数计算中常见的精度问题,揭示了其7位有效数字的真相。通过IEEE 754标准的存储原理和C代码验证,解释了为什么0.1 + 0.2 != 0.3等反直觉现象,并提供了高精度计算解决方案和最佳实践指南,帮助开发者避免浮点数陷阱。

l6m7n8的博客 670

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言浮点精度陷阱:为什么你的比较总是出错?

解决C语言浮点比较误差难题,掌握浮点型精度处理核心方法。通过合理设置C语言浮点型比较的epsilon值,避免因精度丢失导致的逻辑错误,适用于科学计算与嵌入式开发。理解相对误差与绝对误差判断,提升程序稳定性,值得收藏。

FuncLens的博客 1084

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

浮点数的比较

首先,这个不算原创,原文是洋文的,我翻译了一下 写这个文章的人绝对是个大师,虽然知识并不是很深奥,不过想法真的很不错,值得学习 两个月前忽然看见的这篇文章,昨天仔细读了一遍,翻译了一下,原文在此 http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm 这是我翻译的,里面有些地方翻译的不太

稻草人 2175

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

关于浮点数做大小比较的注意点

因为计算机中表示小数时(float,double),都是有误差的,因此在判断两个小数是否相等或者一个浮点是是否等于0时,只能判断它们之差的绝对值是不是在一个很小的范围内。 #define FLOAT_EPS 1e-6 #define DOUBLE_EPS 1e-15 float f_float,f1_float,f2_float; double d_double,d1_double,d2_double; /* 要判断一个单精度浮点数等于0 */ if( fabs(f_float) <= FLO

mxyhktk的博客 425

(译)浮点数比较—Comparing floating point numbers

from: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm 本人翻译了一小段,由于懒惰,没有继续,建议直接看原文。 ==========================================================================================...

huobengluantiao8 466

C语言系列:2、数据类型、运算符和表达式

C语言系列:2、数据类型、运算符和表达式 文章目录C语言系列:2、数据类型、运算符和表达式1. 前言2. 变量名3. 数据类型和长度3.1 基本数据类型3.2 short和long限定符3.3 signed 与unsigned限定符4. 常量4.1 整型常量和浮点型常量4.2 八进制和十六进制表示4.3 字符常量4.4 转义字符4.5 常量表达式4.6 字符串常量4.7 枚举常量5. 声明5.1 变量声明5.2 初始化5.3 const限定符6. 算术运算符7. 关系运算符和逻辑运算符7.1 关系运算符7

逍遥游的博客 642

浮点数比较宏

#define FLOAT_EPS 1e-6 #define DOUBLE_EPS 1e-14 #define FLOAT_EQU(floatA, floatB) ((fabs((floatA)-(floatB))) < (FLOAT_EPS)) //等于 #define FLOAT_MORE(floatA, floatB) (((floatA) - (floatB)) > (FLOAT_EPS)) // floatA > floatB #define FLOAT_LESS(floa..

u013837488的博客 609

ulp(unit in the last place)是什么意思

ULP 百度上的资料非常少,我总结了我查到的相关资料,希望帮助到大家理解。若有解释不当的地方,欢迎指正! ULP(Unit in the last place)是计算机科学中的一个误差单位。 想要理解什么是ULP就需要了解浮点数的原理,本篇文章不做解释,网上的资料很多,这里贴个链接: 浮点数的表示方法优快云 下面开始介绍ULP 单个实数值的ULP定义与计算 定义:对于给定的浮点格式,特定实数值的 ulp 是与此实数值左右最近的两个浮点数的距离。 以IEEE754标准的32位浮点数为例。如果想表示实数

lubxx的博客 1万+

C++第2章 数据类型

目录 2.1 第1个C++程序 2.2 常量及符号 2.3 变量 2.3.1 基本知识 1.常见数据类型取值范围: 2.标识符 3.关键字 2.3.2常见数据类型使用 1.整型int 2.实型float、double 3.字符型char 4.转义字符 5.字符串型string 6.布尔类型bool 2.4数据输入(<<)与输出(>>) 2.4.1.C++语言中的流: 标准I/O有4个类对象 cin(键盘)、cout(显示器)、cerr、clog...

Catherinemin的博客 1091

expression "eps"

eps是浮点相对误差限,是指计算机用于区分两个数的差的最小常数,具体大小和计算机有关,如果两个数的差的绝对值小于eps,则计算机认为这两个数相等。通常是在MATLAB中做除法时,在分母加上eps,防止分母为0,不能得到正确的运算。书中的代码并不是最优的,如果去掉eps对程序运算也没有影响的话,那么这样做可以使代码更为优化。谢谢你给出的建议!

chezhai的博客 454
上一篇: 【C语言INI文件解析核心技术】:掌握分段读取与配置管理的高效方法
下一篇: 【Linux下C语言依赖分析神器】:ldd、readelf、objdump谁最强大?
codetrick
博客等级 码龄17年 151粉丝 1991原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值