习题3-2 高速公路超速处罚

题目描述

在这里插入图片描述

在这里插入图片描述

题目分析

小屁孩为什么要写这篇博客呢,这道题本身并没有难度,但很多初学程序设计语言的朋友在这道题上会遇上一个让人特别头疼的问题,明明程序没什么问题,但为什么测试的时候就会出问题呢?尤其是输入样例二,输出结果为什么会是OK呢?先给大家看一看代码。

#include<stdio.h>
int main (void){
	int v,l;//v是车速,l是限速
	double x;
	scanf("%d %d",&v,&l);
	if(v-l<l*0.1){
		printf("OK");
	}
	else if(v<l*1.5){
		x=(v-l)*1.0/l*100;
		printf("Exceed %.0f%%. Ticket 200",x);
	}
	else{
		x=(v-l)*1.0/l*100;
		printf("Exceed %.0f%%. License Revoked",x);
	}
	return 0;
}

可能大家对这段代码有疑问:

 if(v-l<l*0.1){
  printf("OK");
 }
 

为什么要写成v - l < l * 0.1而不能写成v < 1.1 *l 呢?肯定是这样写有问题,因为浮点数存在精确度的问题,当你输入 v = 110,l = 100时,你认为此时v == 1.1 * l,实际上可能是这样的 110 < 110.00000000000001,后者是我亲自实验计算机输出的值,应该是有限字符效应。运算过程中的有限字长效应与所用的数制(定点制、浮点制)、码制(原码、反码、补码)及量化方式(舍入、截尾处理)都有复杂的关系。例如,使用定点制时,每次乘法之后,会引入误差;而浮点制时,每次加法和乘法之后均会引入误差那你可能又会有疑问了,为什么后面的v < l * 1.5又没有问题呢?这个你就要问计算机了,浮点数的脾气就是这么古怪,喜怒无常。如果你写成v < 1.1 *l 还是不行,那么你可以尝试其他的等价表达。

让你们直观的看看浮点数的小脾气:

在这里插入图片描述

在这里插入图片描述

我相信现在大家应该知道是怎么回事了,如有错误之处,欢迎大家指正,可以随时评论留言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值