Issue with Float/Double in Arduino

hey folks,

i was not able to come out of the shock that in Arduino float/double supports only two digits after decimal.! even though it was mentioned 6-7digits of precision including the digits before and after the decimal. can someone help me to overcome this problem.

i wanted to read a value if 0.009, 0.000008 etc...such kindof values...

any help is appriciated..!

thnq, chiru

While I haven't found anything for this, using some simple notation would be easy. Ex: 9/100 or someVar/100

chiru42: i was not able to come out of the shock that in Arduino float/double supports only two digits after decimal.!

Prove it.

chiru42:
hey folks,

i was not able to come out of the shock that in Arduino float/double supports only two digits after decimal.! even though it was mentioned 6-7digits of precision including the digits before and after the decimal. can someone help me to overcome this problem.

i wanted to read a value if 0.009, 0.000008 etc…such kindof values…

any help is appriciated…!

thnq,
chiru

I think you are confusing the serial print options for floating numbers Vs the underlining percision of the arduino float variables, those are two very different things.

From the serial reference:

Syntax
Serial.print(val)
Serial.print(val, format)

Parameters
val: the value to print - any data type

format: specifies the number base (for integral data types) or number of decimal places (for floating point types)

So you can see you must supply the format parameter if you want to print for other then the default value of two digits past the decimal point.

As far as the percision of the float type used in arduino, also from the reference section:

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

You should be able to work out the range and percision of floats you are working with in your sketch with those two key references. Printing for example .00067 should not be a problem, as long as you format your print statement correctly.

thnq folks....i could overcome this problem now.

thnq all

I'd describe the issue as a bug in the Serial print function myself - default options should not be hiding your values from you.

I'd describe the issue as a bug in the Serial print function myself - default options should not be hiding your values from you.

I disagree; the "bug" is documented on the reference page. http://arduino.cc/en/Serial/Print "For floating point numbers, this parameter specifies the number of decimal places to use."

@MarkT, what should be the default number of decimals for float in your opinion? (just curious)

the default number after decimal for float/double in Arduino is 2

robtillaart: @MarkT, what should be the default number of decimals for float in your opinion? (just curious)

All of them, of course. Every other programming language I can think of does this.

MarkT: I'd describe the issue as a bug in the Serial print function myself - default options should not be hiding your values from you.

Well, that's what defaults do, right?

From the documentation:

Floats are similarly printed as ASCII digits, defaulting to two decimal places.

Although I like this bit:

Programming Tips As of version 1.0, serial transmission is asynchronous; Serial.print() will return before any characters are transmitted.

They forgot to mention: "until the buffer fills up".

All of them, of course. Every other programming language I can think of does this.

Has anyone tried this with a bare "%f" in C ?

``````#include <stdio.h>

int main ()
{
float f = 12.3456789;

printf ("f is %f\n", f);
return 0;

}
``````

Output:

``````f is 12.345679
``````

Microsoft's 'C' runtime library is specified to print six decimal places by default. (Actually, they say it produces six "digits of precision" but I think that's a typo because the accompanying examples show six decimal places.)