警报C++精密整数除法计算损失

非常偶然发现了一个精度损失的问题,简单来说:

有表达式: l = i/30 + j/40 + k/25, 求当{i,j,k} = {50,85,27}时l的值,非常easy,用计算器立即能够算出答案为4.8717,可是编写了下面程序来实现:

int i = 50,j = 85, k = 27;

double l = i/30 + j/40 + k/25;

执行后,结果显示4.000000000。

为什么?这是由于在C++中两个整数相处得到的结果还是整数。故除法都被四舍五入了再相加。就得到结果4.00000了。或许你会说,这种小儿科的问题我不会犯,当然情况是这种时候非常easy看出来,也比較easy避免,但是当i,j。k都是类的三个整数类型成员的时候。常常easy忘了他们是整数类型的,而写出上述表达式。所以,在敲代码时,上述类型的式子要统一写成:

int i = 50,j = 85, k = 27;

double l = i/30.0 + j/40.0 + k/25.0;

这样就不会出错了。

呵呵,这是早就应该知道的问题该,现在才发现,但是,为时未晚,fighting~ O(∩_∩)O~

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-06 05:43:51

警报C++精密整数除法计算损失的相关文章

警惕C++中整数除法计算的精度损失

很偶然发现了一个精度损失的问题,简单来说: 有表达式: l = i/30 + j/40 + k/25, 求当{i,j,k} = {50,85,27}时l的值,很简单,用计算器马上可以算出答案为4.8717,但是编写了以下程序来实现: int i = 50,j = 85, k = 27; double l = i/30 + j/40 + k/25; 运行后,结果显示4.000000000! 为什么?这是因为在C++中两个整数相处得到的结果还是整数,故除法都被四舍五入了再相加,就得到结果4.0000

编译器是如何实现32位整型的常量整数除法优化的?[C/C++]

引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理被除数为常数的除法时,是有优化的,今天整理出来,一来可以了解是怎么实现的,二来如果你哪天要写编译器,这个理论可以用得上.此外,也算我的一个笔记. 实例 我们先来看一看编译器优化的实例.我们所说的被除数为常数的整数除法(针对无符号整型, 有符号整型我们后面再讨论),指的是,对于unsigned int a, b, c,例如:a / 10, b

java double 计算损失精度

计算double类型的数时有时候会多出0.000000001,会有不确定个数的0,在计算时将其转为BigDecimal就不会出错. BigDecimal sum = new BigDecimal(0.0);                BigDecimal tmp = new BigDecimal(0.0);                for(int i=0; i<list.size(); i++){                    tmp = new BigDecimal(list

算法:整数除法上取整

写代码会遇到整数除法需要上取整的情况. 1. 整数除法的话,可以自己写^_^ 1 #!/bin/bash 2 3 num=101 ##被除数 4 pre=10 ##除数 5 6 ##线上取整 7 res=$[(num+pre-1)/pre] 8 echo $res 9 10 ##整数除法默认是向下取整 11 res=$[num/pre] 12 echo $res 2. 或者可以根据使用的语言提供的方法 比如c++ math.h头文件中有提供内置方法: 1 round 2 floor 3 ceil

Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)

import java.util.*; /* * 输入一个整数,计算它各位上数字的和. * (注意:是任意位的整数) */ public class Sum02 { public static void main(String[] args) { System.out.print("请输入任意一个整数:"); Scanner s = new Scanner(System.in); int sum = 0; int t = s.nextInt(); while(t!=0){ sum =

2737 大整数除法

题目来源:http://bailian.openjudge.cn/practice/2737/描述求两个大的正整数相除的商.输入第1行是被除数,第2行是除数.每个数均不超过100位.输出一行,相应的商的整数部分样例输入237624样例输出99题意描述:计算位数不超过200的两个大整数的商解题思路:总体用减法来模拟除法,当然为了让模拟更高效采用一定的方法. 先将被除数和除数分别存进一维字符数组str1和str2如果被除数的长度小于除数的,直接输出0逆置str1和str2存进数组a和b调用jiand

变量的数值(整数)计算

变量的数值计算常用的有如下几个命令: (())用法: 如果要执行简单的整数运算,只需要特定的算术表达式用"$(("和"))"括起来即可 shell的算术运算符号常置于"$(("......"))"的语法中.这一语法如同双引号功能,除了内嵌双引号无需转义 运算符 意义 ++ -- 增加及减少,可前置也可放在结尾 + - ! ~ 一元的正号与负号:逻辑与位的取反 *  /  % 乘法,除法,与取余 + - 加法,减法 <&l

整数在计算中的存储和运算

整数的第一位表示符号位. 1 正整数 正整数在计算机中直接用它的二进制存储,例如: short s = 3; 3 = 2^1 + 2^0 短整型一般为2个字节,即16位,它的对应的存储方式为: 0 000 0011 所以,短整型的表示范围为:-2^15  ~ +2^15 0是个特例,它有两种表示方式: 1 000 0000 0 000 0000 所以,短整型一共只有2^16 - 1 个数. 再看整型,整型的存储为4个字节,32位 int i = 7; 7 = 2^2 + 2^1 + 2^0 即:

shell基础:使用read、命令行脚本传参实现输入2个整数并计算

shell基础练习题:使用read交互输入,命令行脚本传参2种方式,实现输入2个整数数字,并计算加减乘除.考察shell基础知识包括:变量定义.read.if判断语句.正则表达式等知识: 第一种方式:read交互输入参数 思路为:判断输入的第2个变量是否为空,为空则提示输入2个数字:不为空则判断输入的是否为整数,用到expr,作用为让2个变量进行相加,如果结果为0说明输入2个为数字,如结果非0则说明输入非整数,提示输入的不是非整数: #!/bin/bash read -p "pls input