对精度问题的处理技巧

在Luogu分类中看到的有关精度问题的题目:

P2393 传送门 P2394 传送门

 

以前没有遇见过考这样知识点的题目……

1、浮点数的有效位数不满足要求时化为整型计算

一般来说$double$的有效位数为15~16位,$long double$的有效位数为18~19位

(注意,达到上界16/19位时并不保险,$double$有效值的确切上界为$2^{52}=4503599627370496$)

 

当题目要求的有效位数过高时,将浮点数乘上$10^n$化为整型计算

此时就可以使用高精度算法等处理整型大数的技巧来解决问题,最终答案再除以$10^n$即可

#include <bits/stdc++.h>

using namespace std;
typedef long double ld;
int main()
{
    ld x,res=0;
    while(scanf("%Lf",&x)!=EOF) res+=x*1e6;
    printf("%.5LF",res/1e6);
    return 0;
}

 

 

2、输入位数过多时会产生精度问题,要强制去除后面的位数

(我并不知道原因

注意$scanf$中说明符号前有一个读取长度参数可以设置

如$scanf( "\% 10d",\& n)$就只读取输入的前10个字符,后面的仍存在缓冲流里

#include <bits/stdc++.h>

using namespace std;
typedef long double ld;
int main()
{
    ld x;
    scanf("%15Lf",&x);
    printf("%.8Lf",x/23);
    return 0;
}

 

转载于:https://www.cnblogs.com/newera/p/9278481.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值