float和double 精度分析_mfc float溢出判断_giantmfc123的博客-程序员宅基地

技术标签: double  float  成长进步  

  1. 结论
    1.)范围
    float和double的范围是由指数的位数来决定的。
    float的指数位有8位,而double的指数位有11位,分布如下:
    float:
    1bit(符号位) 8bits(指数位) 23bits(尾数位)
    double:
    1bit(符号位) 11bits(指数位) 52bits(尾数位)
    于是,float的指数范围为-127+128,而double的指数范围为-1023+1024,并且指数位是按补码的形式来划分的。
    其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
    float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

  2. ) 精度
    float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
    float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
    double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

  3. 详细分析
    参考https://www.cnblogs.com/c-primer/p/5992696.html

  4. 验证
    1.) float

	float f1 = 1.23456789;
	float f2 = 1.23456781;
	bool fresult = qFuzzyCompare(f1, f2);

因为前6位一样,所以结果为true
在这里插入图片描述
2 )float

	float f3 = 1.2345;
	float f4 = 1.2346;
	fresult = qFuzzyCompare(f3, f4);

因为第4位不一样,所以结果为false
在这里插入图片描述
3 ) double

	double d1 = 1.23456789;
	double d2 = 1.23456781;
	bool dresult = qFuzzyCompare(d1, d2);

因为第8位不一样,所以结果为false
在这里插入图片描述
5. qFuzzyCompare 详解

Q_REQUIRED_RESULT Q_DECL_CONSTEXPR static inline Q_DECL_UNUSED bool qFuzzyCompare(double p1, double p2)
{
    return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}

Q_REQUIRED_RESULT Q_DECL_CONSTEXPR static inline Q_DECL_UNUSED bool qFuzzyCompare(float p1, float p2)
{
    return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mafucun1988/article/details/87783707

智能推荐

[PTA] 计算分段函数[2]_pta计算分段函数2_蓝胖子(*^_^*)的博客-程序员宅基地

本题目要求计算下列分段函数f(x)的值:注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。输入格式:输入在一行中给出实数x。输出格式:在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。输入样例1:10输出样例1:f(10.00) = 3.16输入样例2:-0.5输出样例2:f(-0.50) = -2.75代码:#include<stdio.h>#_pta计算分段函数2

mac通过docker安装并配置mysql和nacos_m2 mac docker 安装nacos_飞鱼同学的博客-程序员宅基地

在docker中使用mysq和nacos并且将容器的目录挂载到本地,好处是便于数据的备份,删除容器之后数据不会丢失,同时使用mysql数据库存储nacos的配置数据,使用docker网络实现容器之间的通信。_m2 mac docker 安装nacos

tf2单层神经网络mnist手写数字识别_为什么mnist 标准化除以255 不是 256_安達と島村的博客-程序员宅基地

tf2的mnist的xtrain和xtest取值范围0~255,需要除以255,否则y_pre全是nan。import tensorflow.compat.v1 as tfimport tensorflow as tf2tf.disable_v2_behavior()import numpy as npfrom tensorflow.keras.datasets import mnistimport matplotlib.pyplot as pltdef add_layer(inputs,i_为什么mnist 标准化除以255 不是 256

在centOS中安装MySQL时遇到Configuring incomplete,errors occurred该怎么办?_configuring incomplete, errors occurred_明国江南一场雨的博客-程序员宅基地

Configuring incomplete,errors occurred 错误处理方法今天笔者在安装数据库的时候不幸遇到了问题,如下图:请参阅Cmake编译器的指定日志,,,,,,,,没事,就是有点头疼。。。。。。。。。。。百度到的结果是..._configuring incomplete, errors occurred

解决 Android N 7.0 上 报错:android.os.FileUriExposedException_Kenway090704的博客-程序员宅基地

在测试vivo 7.0 上测试更新软件,出行错误android.os.FileUriExposedException: file:///storage/emulated/0/Download/appName-2.3.0.apk exposed beyond app through Intent.getData()解决方法在AndroidManifest.xml中添加如下代码

随便推点

msvsmon.exe_xinpo66的博客-程序员宅基地

msvsmon.exe远程调试的工具。一般在这个目录下面:Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\x86使用方法:1, 在被调试的电脑上打开工具,点菜单 : Tools-Options 设置好权限2,待调试的电脑上打开vS,点菜单 调试-附加到进程。传输里面选 远程(无身份验证时仅限本机)限

Intent_notahero的博客-程序员宅基地

原谅我愚昧,Intent七大属性这个概念我也是昨天才接触到,看了一下,都是一些常用的东西,就是没有总结过,那么今天就来简单总结一下。Intent七大属性是指Intent的ComponentName、Action、Category、Data、Type、Extra以及Flag,七个属性,总体上可以分为3类:第一类:启动,有ComponentName(显式),Action(隐式),Categor

什么是闭包?以及闭包的作用_fuyuyuki的博客-程序员宅基地

一.闭包的概念闭包是这样的一种机制:函数嵌套函数,内部函数可以引用外部函数的参数和变量。参数和变量不会被垃圾回收机制收回。1.函数嵌套函数function fn(a){ return function(){ //访问道这个a console.log(a); } } console.log(fn('hello'));//调用外部的函数 f_闭包

C语言学习必看的N本书-续(一定要看呵)_weixin_30782331的博客-程序员宅基地

Expert C Programming(C专家编程)作 者:(美)LinDen,P.V.D(林登) 著,徐波 译出版社: 人民邮电出版社 编辑推荐: 书本撷取了几十个实例,细致、深入地讲解了C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及分析了如何进一步学习C++等问题。 本书是一本ANSI C编程语言的高级读本。它适用于已经编写过C程序的人..._c语言讲递归的书

学习NPM这一篇就够了_npm 学习_轻松的小希的博客-程序员宅基地

目录第一章 NPM 概述第二章 NPM 安装第三章 NPM 命令3.1、配置淘宝镜像源3.2、安装所有软件包3.3、安装单个软件包3.4、更新所有软件包3.5、更新单个软件包3.6、卸载指定软件包3.7、安装旧版软件包3.8、软件包版本查看3.9、软件包安装类型3.10、软件包版本介绍3.11、如何使用软件包第四章 package.json 文件4.1、文件介绍4.2、文件结构4.3、属性分类4.3.1、name4.3.1、author4.3.2、contributors4.3.3、bugs4.3.4、ho_npm 学习

《C++ Primer Plus》学习笔记 | 第10章 对象和类_大虎牙的博客-程序员宅基地

第10章 对象和类面向对象编程OOP特性:抽象封装和数据隐藏多态继承代码的可重用性10.1 过程性编程和面向对象编程采用过程性编程:首先考虑遵循的步骤,然后考虑如何表示这些数据。采用OOP: 首先考虑数据,考虑如何表示数据,和考虑如何使用数据。(首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储...

推荐文章

热门文章

相关标签