关于C++数据类型使用的注意点

本文探讨了在C语言中处理浮点运算时遇到的数据类型转换问题,特别是当处理大数值时如何避免数据丢失。通过实例分析,介绍了使用long long类型和强制类型转换的方法来解决1/n^2系列求和的问题。同时,补充了自动类型转换和强制类型转换的基本规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近被人问到一道题:
输入两个整数n<m<106,输出1/n2+1/(n+1)2+…+1/m2,保留5位小数。

一开始是这样写的

	int i;
	double sum=0;
	for(i=n;i<=m;i++)
		sum+=1/(double)(i*i);
	printf("%.5f",sum);

结果错了。
为什么呢,因为n,m最大是106,平方之后是1012,而32位int类型最多存放10位十进制数,导致了数据丢失。

两种改进方法:

	long long i;
	double sum=0;
	for(i=n;i<=m;i++)
		sum+=1/(double)(i*i);
	printf("%.5f",sum);

①将 i 声明为long long类型 ( long和32位int是一样的,long同样不够 ),这样 i * i 的值就存得下了。

	int i;
	double sum=0;
	for(i=n;i<=m;i++)
		sum+=1/((double)i*(double)i);
	printf("%.5f",sum);

②将两个 i 分别强制类型转换成double类型,再相乘。

再者,关于数据类型的转化补充一些。

①自动类型转换,发生在以下4种情况:

1、算术运算式中,低类型能够转换为高类型。
2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

Ps.字符型会转换为整型。

②强制类型转换:
(类型说明符) (表达式)

数据类型转换时,一般低类型转换为高类型,不会丢失数据,而高类型向低类型转换,会发生数据丢失。(主要与数据的存储位数有关)(而浮点型转换为整型会去除小数)

因此,这里int、long long转double就不会丢失数据。

参考资料:https://blog.youkuaiyun.com/cherish_2012/article/details/21243047

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值