iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中浮点数的精度丢失问题解决
  • 723
分享到

C语言中浮点数的精度丢失问题解决

2024-04-02 19:04:59 723人浏览 独家记忆
摘要

目录一 先来看一段代码运行结果:二 如何解决(1)浮点数的大小比较(2)含浮点数的表达式和0.0的比较总结一 先来看一段代码 #include<stdio.h> int

一 先来看一段代码

#include<stdio.h>
int main()
{
    double test=0.1;
    printf("%.100lf",test);
    return 0;
}

运行结果:

 直接从现象说结果:精度丢失由于计算机二进制转化过程中因为比特位过多发生数据的截断导致的,这个结果是可以偏大也可以偏小的。

解释一下:首先要知道二进制转换为十进制的基本方法(除二取余法,乘五取余法等等),最好再了解一下浮点数的存储,这里的0.1就是一个典型的例子,对0.1乘五取余是乘不尽的,那么数据转化成的二进制序列的长度就会超出double的范围。那么多出的数据就会被截断。

二 如何解决

如果你想的是彻底让屏幕显示出来的是0.1,那么,你不孤单,我一开始也是这样想的,但是这是不可能的。但是这个对我们的实际意义不大,毕竟有效的区段还是够的。

我在这里具体要解决的是两个问题

(1)浮点数的大小比较

#include<stdio.h>
int main()
{
    double test=0.1;
    if(test==(1-0.9))
    {
        printf("正常");
    }
    else
    {
        printf("what!!!");
    }
    return 0;
}

这段代码会输出“what!”。为什么上面已经说了0.1乘不尽,这里换成0.5是OK的,因为0.5D用二进制表示就是0.1B。每次都考虑乘不尽不烦吗?

解决方案

引入库函数<float.h>里定义的宏DBL_EPSILON。

 这里后面的一段英文是他是导致x+n!=x的最小值  (n代表EPSILON伊普西隆,x是任意值)

也就是说,任意一个比EPSILON小的值,你给一个数加上,都不会改变它的值。

那么,比EPSILON小的值引起的精度丢失都是在我们的允许范围内的

#include<stdio.h>
#include<float.h>
#include<math.h>
int main()
{
    double test = 0.1;
    if (fabs(test - (1 - 0.9)) < DBL_EPSILON)
    {
        printf("正常");
    }
    else
    {
        printf("what!!!");
    }
    return 0;
}

上图有两个点

1 。在<math.h>下的fabs(a)即取a的绝对值

想象一根数轴,他们相减的绝对值就是他们的距离

2 。 if(fabs(test-(1-0.9)<DBL_EPSILON))

等价于(test==1-0.9)(当然是对我们     人     而言)

test和(1-0.9)的距离若是小于DBL_EPSILON,那么精度的丢失是在可控范围内的,说明他们俩相等

(2)含浮点数的表达式和0.0的比较

要先把上面的搞明白。

之所以单独说这个问题,我是想强调一个数字与零作比较到底应该是a<DBL_EPSILON还是a<=DBL_EPSILON,加强一下理解

EPSILON是允许范围内的最小值(回到宏定义后面的解释),所以这个等于不可以加,加了说明上面的a如果等于EPSILION时,会导致数值的改变。

想要彻底解决精度丢失,是不可能的,也没必要,但我们有办法用近似来解决。

如果看完这篇文章你还是很迷糊,但我还是想说这是不能彻底解决的(我一开始也有这种想法),那么希望下次我准备出的数据的存取能对你有帮助。篇幅太长了,所以删删减减还是准备放到下次。

总结

到此这篇关于C语言中浮点数的精度丢失问题解决的文章就介绍到这了,更多相关C语言浮点数精度丢失内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中浮点数的精度丢失问题解决

本文链接: https://www.lsjlt.com/news/162301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中浮点数的精度丢失问题解决
    目录一 先来看一段代码运行结果:二 如何解决(1)浮点数的大小比较(2)含浮点数的表达式和0.0的比较总结一 先来看一段代码 #include<stdio.h> int ...
    99+
    2022-11-12
  • 如何解决C语言中浮点数的精度丢失问题
    小编给大家分享一下如何解决C语言中浮点数的精度丢失问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一 先来看一段代码#include<stdio.h>...
    99+
    2023-06-26
  • js浮点数精度丢失的问题及解决方法
    本篇内容介绍了“js浮点数精度丢失的问题及解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明在数学计算中,小数会有一定的误差,这是计...
    99+
    2023-06-20
  • Golang浮点数精度丢失问题扩展包的解决方法
    小编给大家分享一下Golang浮点数精度丢失问题扩展包的解决方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!PS: 今天在做项目进行精度处理的时候出现精度丢失问题,在这里跟大家分享下扩展包解决方案, 注意:这个问题是可能...
    99+
    2023-06-08
  • 解决java.sql.Timestamp丢失精度的问题
    目录java.sql.Timestamp丢失精度需要重新补偿java.sql.Timestamp类的使用1. 获取当前时间2.String类型转换为Timestamp3.Timest...
    99+
    2022-11-12
  • python浮点数运算精度问题如何解决
    在Python中,浮点数运算可能存在精度问题,可以采取以下方法解决:1. 使用Decimal模块:Decimal模块提供了精确的十进...
    99+
    2023-08-26
    python
  • JS中浮点数精度问题的分析与解决方法
    目录前言问题的发现浮点数运算后的精度问题toFixed奇葩问题为什么会产生浮点数的存储浮点数的运算解决方法解决toFixed解决浮点数运算精度附:JS浮点数精度问题的一些实用建议总结...
    99+
    2022-11-13
  • 一文教会你解决js数字精度丢失问题
    目录一、关于为什么要解决精度丢失二、怎么解决js的计算精度丢失问题?三、toPrecision 特定方法返回四舍五入长度字符串结语一、关于为什么要解决精度丢失 可以看下例子,因为js...
    99+
    2022-11-13
  • 利用Math.js解决JS计算小数精度丢失问题
    目录缘由问题的原因最通俗的解释解决方案 - Math.js安装封装使用附:math.js 大数功能总结缘由 最近在做公司的一个点餐H5项目需要前端动态计算用户选的商品的总价(单价*数...
    99+
    2022-11-13
  • Python中的浮点数计算精度问题是如何解决的?
    Python中的浮点数计算精度问题是如何解决的?在计算机科学中,浮点数计算精度问题是常见的挑战之一。由于计算机内部使用有限的比特位来表示浮点数,所以对于某些小数的表示和运算时,可能会出现精度损失的情况。Python作为一门强大的编程语言,提...
    99+
    2023-10-22
    解决 浮点数 精度
  • Golang处理浮点数遇到的精度问题怎么解决
    这篇文章主要介绍“Golang处理浮点数遇到的精度问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang处理浮点数遇到的精度问题怎么解决”文章能帮助大家解决问题。一、浮点数是什么?浮...
    99+
    2023-06-29
  • 解决Pytorch半精度浮点型网络训练的问题
    用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1、网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2、模型参数转换为half型,不必索引到每层...
    99+
    2022-11-12
  • SpringBoot全局配置long转String丢失精度的问题解决
    目录第一种方式 第二种方式 第三种方式 第四种方式(缺点:将所有的数字类型都会转为字符串) web项目中,Java后端传过来的Long/long类型,前端JS接收会丢失精度。 本文推...
    99+
    2022-11-12
  • iOS浮点类型精度问题的原因与解决办法
    目录前言如何解决浮点型精度问题四舍五入处理更优的解决方案精度丢失的原因浮点类型的存储方式有效位数指数的存储方式:移位存储double类型总结:输出结果丢失精度原因前言 相信不少人(其...
    99+
    2022-11-13
  • 解决Go语言Websocket应用程序中的数据丢失问题
    在Go语言的Websocket应用程序中,数据丢失问题是一个常见的问题。由于Websocket采用的是异步传输方式,数据包可能会在传输过程中丢失或损坏。这种情况下,如何解决数据丢失问题,是每个开发人员都需要面对的挑战。本文将介绍一些解决Go...
    99+
    2023-12-14
    Go语言 websocket 数据丢失问题
  • SpringBoot主键ID传到前端后精度丢失的问题解决
    目录简介问题描述项目场景问题描述实例问题复现解决方案全局处理局部处理简介 本文用示例介绍SpringBoot如何解决雪花算法主键ID传到前端后精度丢失问题。 问题描述 Java后端L...
    99+
    2022-11-13
  • java中数值范围的精度丢失如何解决
    java中数值范围的精度丢失如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.java中int,float,long,double取值范围public class Te...
    99+
    2023-05-31
    java ava
  • SpringBoot2.0解决Long型数据转换成json格式时丢失精度问题
    目录解决Long型数据转换成json格式时丢失精度SpringBoot时间格式,Long型精度丢失常见问题时间格式,Long型精度丢失解决Long型数据转换成json格式时丢失精度 ...
    99+
    2022-11-13
  • Python中的浮点数计算精度问题的原因和解决方案有哪些?
    Python中的浮点数计算精度问题的原因和解决方案有哪些?在进行浮点数计算时,我们经常会遇到精度问题。这是由于计算机采用二进制来表示浮点数,而不是十进制。由于二进制无法准确表示一些十进制小数,导致了浮点数计算的精度问题。一、浮点数计算精度问...
    99+
    2023-10-22
    解决方案 (solution) 浮点数 (float) 精度问题 (precision issue)
  • SpringBoot怎么解决Long型数据转换成json格式时丢失精度问题
    这篇“SpringBoot怎么解决Long型数据转换成json格式时丢失精度问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作