浮点数精度问题(CSP38思考)

        CSP38的第一题,考到了浮点数的除法(当然考完发现其实也可以不涉及浮点数,直接转化为整型),我第一题一直卡到70、80分,故写下此文。


        浮点数的运算有精度损失问题,那么应该如何解决和避免呢?

        一个int类型变量乘以1.0,转化的是double型(64位系统下,8字节),如果乘以1.0f,那就是float型(4字节)。

	int a=10;cout<<sizeof(a*1.0f)<<endl;cout<<sizeof(a*1.0)<<endl;/*48*/

        这是常见的在除法中避免精度损失的方法,如下:

int a=2;
int b=5;
cout<<a/b<<" "<<a*1.0/b<<endl;
/*0 0.4*/

        这样看似确实解决了精度,但是这只是保证了过程中的精度问题 ,如果我们把这个double类型的值赋给其它变量,那就又要看这个赋值变量了。

float 与 double 的区别 

        float为32位,double位64位,但这并不代表和整型一样,实际用来计算的位数更少,因为有符号位等。就和我们计算Pi后的小数点一样,小数点后位数越多,精度肯定越高。在一些对精度要求高的地方肯定是用double。但是肯定不能和整数运算相比。

        商业级的有BigDecimal,目前在算法比赛中,如果涉及到浮点数运算,大多数都是可以进行约分的,把分母约掉,要仔细观察题目。如果没有,那就是你没找到正确的方法。被迫用小数运算,就用double,不要用float!!!

        最后可以看一下我写的CSP38第一题,一个80分代码,一个AC代码,大家可以看看有什么区别,问题在哪里?

题目:正态分布(normal)--CSP38

        对于正态分布随机变量 X ∼ N(µ, \sigma ^2)(均值 µ、标准差 σ),查表计算 P (X ≤ n)。具体来说,我们首先需要将 X 转换为标准正态分布 Z:

Z=\frac{X-\mu}{\sigma}

那么 X ≤ n 的概率也就等于 Z ≤ \frac{n-\mu}{\sigma}的概率:

P (X \leq n) = P (Z \leq\frac{n-\mu}{\sigma})

        而对于服从标准正态分布的 Z,其小于等于某值的概率 P (Z ≤ m) 可以通过查表得出。图 1 展示了 m 取值从 0.00 到 1.49 的结果(步长 0.01),其中每列对应 m 的百分位、每行对应 m 的十分位和整数部分。该表可继续向下延伸,这里只展示部分结果。

 图 1: 标准正态分布常用值表

        如图 2 所示, Z ≤ 1 的概率即为阴影部分的面积,查看表中 1.0 对应行、 0.00 对应列即可得到近似结果 0.8413。

图 2: 标准正态分布示意图


        在本题中你需要模拟上述查表的过程,处理 k 个如下查询:对于给定的参数 µ、 σ和 n,计算 P (X ≤ n) 的结果在表中的哪一行、哪一列?

        其中行列下标均从 1 开始:

        • 行: 0.0 对应第 1 行, 0.1 对应第 2 行,依此类推……

        • 列: 0.00, 0.01, · · · , 0.09 依次对应第 1、第 2 到第 10 列。

【输入格式】

从标准输入读入数据。

输入的第一行包含一个正整数 k,表示查询的个数。

接下来输入 k 行,每行包含空格分隔的三个整数 µ、 σ 和 n,表示一个查询。

【输出格式】

输出到标准输出。

每个查询输出一行,包含空格分隔的两个整数 i 和 j,表示查询的结果位于表中第i 行、第 j 列。

【样例输入】

1         4

2         0 1 1

3         2 10 127

4         2 50 227

5         5 100 350

【样例输出】

1         11 1

2         126 1

3         46 1

4         35 6

【样例解释】

        第一个查询等价于计算 P (Z ≤ 1-1 0),如题目描述所示,查看表中 1.0 对应行(第11 行)、 0.00 对应列(第 1 列)即可。

【子任务】

全部的数据满足:

• k ≤ 20;

• 参数 µ、 σ 和 n 均为整数;

• 0 ≤ µ ≤ n ≤ 1000;

• 1 ≤ σ ≤ 100 且标准差 σ 是 100 的因子。

80分代码:

#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;int a=0,b=0,c=0;float s=0;int x=0,y=0;for(int i=0;i<n;i++){cin>>a>>b>>c;s=((c*1.0-a*1.0)*1.0/b*1.0)*10.0;
//		s=((c-a)/b)*10.0;x=(int)s;s=s*1.0-int(s)*1.0;
//		cout<<s<<endl;s*=10.0;y=(int)s;printf("%d %d\n",++x,++y);}return 0;
}

AC代码:

#include<bits/stdc++.h>using namespace std;int k;int main(){cin >> k;while(k--){int u,sgm,n;cin >> u >> sgm >> n;double ans = 0.00;double ans2=0.00;int ans1 = 0;int ans3 = 0;ans = (double) (n-u)/sgm;ans2 = abs((int)(ans*10)-(ans*10))*10+1;ans = ans*10+1;ans1 = ans;cout << ans1 << " " <<ans2 << endl;}
}

         目前我想的就是float与double问题,最后推测一个正确代码,具体还要等我下次模拟开放提交一下代码试试了:

#include<bits/stdc++.h>
using namespace std;int main(){int u,Sigma,n;int Z;cin>>u>>Sigma>>n;Z=(u-n)*100/Sigma;/*不会用到小数,直接忽略*/cout<<Z/10<<" "<<Z%10;return 0;
}

参考文献

浮点类型计算精度不准确原因及如何规避 - wangsong412 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

F5 – TCP 连接管理:会话、池级和节点级操作

在 F5 BIG-IP 中,您可以在池成员级别或节点级别管理流向服务器的流量。节点级别状态会影响与该节点关联的所有池,而池成员状态则仅限于单个池。了解每种方法以及何时使用它们对于顺利进行维护窗口和流量管理至关重要。 池级状态:启用、禁用、强制离线、移除 在 BIG-IP 配置…

StoreView SQL,让数据分析不受地域限制

作者&#xff1a;章建&#xff08;处知&#xff09; 引言 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】&#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0c…

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…

Golang——10、日志处理和正则处理

日志处理和正则处理 1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer捕获panic 2、正则处理2.1、正则表达式语法大全2.2、基本匹配2.3、常见函数使用2.4、从html提取汉字demo 1、logx日志处理 1.1、logx简介 logx 是 go-zero 框架中用于日志记…

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…

软件工程:如何做好软件产品

1、什么是产品 从项目到产品 产品&#xff1a;满足行业共性需求的标准产品。即要能够做到配置化的开发&#xff0c;用同一款产品最大限度地满足不同客户的需求&#xff0c;同时让产品具有可以快速响应客户需求变化的能力。 好的产品一定吸收了多个项目的共性&#xff0c;一定是…

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…

sqlsugar WhereIF条件的大于等于和等于查出来的坑

一、如下图所示&#xff0c;当我用 .WhereIF(input.Plancontroltype > 0, u > u.Plancontroltype (DnjqPlancontroltype)input.Plancontroltype) 这里面用等于的时候&#xff0c;返回结果一条数据都没有。 上图中生成的SQL如下&#xff1a; SELECT id AS Id ,code AS …

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…

React从基础入门到高级实战:React 实战项目 - 项目四:企业级仪表盘

React 实战项目&#xff1a;企业级仪表盘 欢迎来到 React 开发教程专栏 的第 29 篇&#xff01;在前 28 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和实时通信等核心内容。这一次&#xff0c;我…

STM32----IAP远程升级

一、概述&#xff1a; IAP&#xff0c;全称是“In-Application Programming”&#xff0c;中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口&#xff08;如USART&#xff0c;IIC&#xff0c;CAN&#xff0c;USB&#xff0c;以太网接口甚至是无线射频通道&#…

模拟搭建私网访问外网、外网访问服务器服务的实践操作

目录 实验环境 实践要求 一、准备工作 1、准备四台虚拟机&#xff0c;分别标号 2、 防火墙额外添加两块网卡&#xff0c;自定义网络连接模式 3、 关闭虚拟机的图形管理工具 4、关闭防火墙 5、分别配置四台虚拟机的IP地址&#xff0c;此处举一个例子&#xff08;使用的临…

删除远程已经不存在但本地仍然存在的Git分支

1. 获取远程分支列表 首先&#xff0c;确保你获取了远程仓库的最新分支信息&#xff1a; git fetch -p -p 参数会自动清理本地仓库中那些在远程已经被删除的分支的引用。 2. 查看本地分支与远程分支的对比 运行以下命令来查看哪些本地分支没有对应的远程分支&#xff1a; …

GIT(AI回答)

在Git中&#xff0c;git push 命令主要用于将本地分支的提交推送到‌远程仓库‌&#xff08;如GitHub、GitLab等&#xff09;。如果你希望将本地分支的改动同步到另一个‌本地分支‌&#xff0c;这不是 git push 的设计目的。以下是正确的替代方法&#xff1a; 方法1&#xff1…

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…

React - 组件通信

组件通信 概念&#xff1a;组件通信就是组件之间数据传递&#xff0c;根据组件嵌套关系不同&#xff0c;有不同的通信方法 父传子 —— 基础实现 实现步骤 父组件传递数据 - 在子组件标签上绑定属性子组件接收数据 - 子组件通过props参数接收数据 声明子组件并使用 //声明子…

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…

计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析

追踪计算机视觉领域的前沿热点是把握技术发展方向、推动创新落地的关键&#xff0c;分析这些热点&#xff0c;不仅能洞察技术趋势&#xff0c;更能为科研选题和工程实践提供重要参考。本文对计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点进行了…

互联网大厂Java求职面试:云原生与微服务架构的深度探讨

互联网大厂Java求职面试&#xff1a;云原生与微服务架构的深度探讨 第一轮提问 面试官&#xff1a; “郑薪苦&#xff0c;假设我们要设计一个大规模电商平台的微服务架构&#xff0c;你会如何设计其订单服务&#xff1f;” 郑薪苦&#xff1a; “首先&#xff0c;我会采用…