Problem with rounding using lrint


 
Thread Tools Search this Thread
Top Forums Programming Problem with rounding using lrint
# 1  
Old 11-04-2016
Problem with rounding using lrint

I run into a situation when integer result of 81 * 0.5 is 40 (expected 41) when using lrint() function.

When I use a simple +0.5 approach results are right.

The code is:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 int main(int argc, char *argv[])
{
        const int       X       = 81;
        double          prc     = (argc == 2) ? atof(argv[1]) : 0.5;
        double          dval    = X * prc;
        long            ival    = lrint(dval);
        printf("%i * %.16f = %.16f  IVAL = %li  ", X, prc, dval, ival);
        ival = (X * prc) + 0.5;
        printf("USING +0.5 IVAL = %li\n", ival);
        return(0);
}

results are:
Code:
~$ c 0.5
81 * 0.5000000000000000 = 40.5000000000000000  IVAL = 40  USING +0.5 IVAL = 41

Using gcc ver 5.4.0 on Linux, running on 2 years old Xeon processor, if that matters. I checked floating point rounding defaults in compiler and it is a regular "round to the nearest integer" rule.

My question is - should I abandon rint-family functions and use +0.5 approach?
# 2  
Old 11-04-2016
You need to determine what rounding rules you want to use for tie-breaking cases (see Wikipedia's discussion on rounding)
and you need to realize that even in double precision floating point, the result of a floating point calculation is not always exact (even when computing a value using decimal calculations would be exact). For example, the awk program (which uses double precision floating point for its calculations):
Code:
printf '.1 .5\n.3 .5\n' | awk '{printf("%.40f\n", $1 * $2)}'

produces the output:
Code:
0.0500000000000000027755575615628913510591
0.1499999999999999944488848768742172978818

not the output you might expect:
Code:
0.0500000000000000000000000000000000000000
0.1500000000000000000000000000000000000000

Which shows two examples where decimal arithmetic produces exact results, but binary arithmetic produced one result that was a little bit high and one result that was a little bit low.
# 3  
Old 11-04-2016
Thanks.
I'd love to hear what others use in C/C++, that is rint() family functions? home grown solutions?
# 4  
Old 11-05-2016
Normally you call fegetround() to determine which rounding mode of the four possible ones is active.

fesetround() sets the mode. Only the fpu supported modes are available on a particular box.


For complete details try:
The GNU C Library: Rounding
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Rounding off a decimal

How to round off a decimal number to higher whole number using ceil command in unix? Eg. 4.41 or 4.11 or 4.51 should be rounded off to 5. (11 Replies)
Discussion started by: SanjayKumar28
11 Replies

2. UNIX for Dummies Questions & Answers

Rounding up to nearest whole number

Hi all of you, Would be great if you help me with how to round up to whole number from my input values like 2.99996,2.17890,3.00002,-2.3456,-2.7890 o/p should be like 3,2,3,-2,-3 thnks in adv!!!! regards (3 Replies)
Discussion started by: Indra2011
3 Replies

3. Shell Programming and Scripting

Rounding number, but....

Dear Experts, I'm trying to find a way to round a number but in this way: 14367.577 ---> 14000 I used the following to round the number to the closer integer: echo $var|awk '{print int($1+0.5)}' and also: xargs printf "%1.0f" However, they don't work for my above... (9 Replies)
Discussion started by: Gery
9 Replies

4. UNIX for Dummies Questions & Answers

Rounding a decimal

Hi, I am currently using tcsh I am trying to round a decimal number to the ten-thousandths place For instance: 1.23456 is rounded up towards 1.2346 I am not looking for truncation, but for rounding. Anyone know how to do this with awk or expr? Thanks (2 Replies)
Discussion started by: miniwheats
2 Replies

5. Shell Programming and Scripting

Rounding Script Help

I need some help with my rouding script. I have started pretty much from scratch and have no idea if its correct or even close but I have been trying and have gotten to this point. i keep getting syntax errors and im not sure what is wrong. Here is what I got let value=$1; while do let... (4 Replies)
Discussion started by: kingrj46
4 Replies

6. Linux

Rounding Script Help

I need some help with my rouding script. I have started pretty much from scratch and have no idea if its correct or even close but I have been trying and have gotten to this point. i keep getting syntax errors and im not sure what is wrong. Here is what I got let value=$1; while do let... (0 Replies)
Discussion started by: kingrj46
0 Replies

7. Shell Programming and Scripting

Rounding off to the next whole number

Hello, I searched a lot on this Forum. Please help me with the below problem. I want to divide two numbers and the result should be the next nearest whole number. E.G. Dividing 10.8/5 ideally gives 2.16. But the result should be 3 i.e. rounded off to the next whole number. Any help will... (2 Replies)
Discussion started by: damansingh
2 Replies

8. Shell Programming and Scripting

Rounding off the value of Floating point value

Hello, i have some variables say: x=1.4 y=3.7 I wish to round off these values to : x = 2 (after rounding off) y = 4 (after rounding off) I am stuck. Please help. (7 Replies)
Discussion started by: damansingh
7 Replies

9. UNIX for Dummies Questions & Answers

Rounding problem

Hi, Can any one help me in finding a solution for rounding off to 2 decimal places. I am using the following code: VAR1=.01292105263157894736 VAR2=`echo "scale=2; $VAR1 * 100" | bc -l` The result I 'm getting is 1.29210526315789473600 But I need the output as 1.29 Thanks Shash (2 Replies)
Discussion started by: shash
2 Replies

10. Shell Programming and Scripting

Rounding off using BC.

Hello again. I'm trying to use BC to calculate some numbers in a shell script. I want to have the numbers rounded off to 1 decimal place. for example: initsize=1566720 zipsize=4733 I'm trying to get the ratio between them. the equation is: (($initsize-$zipsize)/$initsize)*100 so... (3 Replies)
Discussion started by: noodlesoup
3 Replies
Login or Register to Ask a Question