View previous topic :: View next topic |
Author |
Message |
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Thu Feb 21, 2019 2:26 pm Post subject: how can I format double variables? |
|
|
I want to output numbers on LCD and with serial output that need more digits than single variables offer. The Print with double goes to scientific format with numbers <1 and >1000. So I miss a "config double=normal".
What can I do to print double variables without scientific format??
(BASCOM-AVR version : 2.0.7.9 , Latest : 2.0.8.1 ) |
|
Back to top |
|
|
kimmi
Joined: 24 Feb 2006 Posts: 1922 Location: Denmark
|
Posted: Fri Feb 22, 2019 5:00 am Post subject: |
|
|
did you try use
$external _dbl_normalize _________________ / Kim |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Fri Feb 22, 2019 9:01 pm Post subject: |
|
|
I did not know that. That sounds good but it shows no effect. Furthermore, scientific format is output in the simulator. Normalized usual means that the exponent is adjusted so that the fraction begins with a leading 1.
Maybe I'm doing something wrong. The compiler does not report an error with external _dbl_normalize. In the manual there is no description of what it should do.
An example to explain my problem:
Dim d as double
D=2/3
Print D
The output: 666.666666666667E-3
That does not fit on the display and would be too difficult to read. |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Fri Feb 22, 2019 9:24 pm Post subject: |
|
|
you can use the additional parameter :
Dim S As String * 16
S = Str(d , '8 digits behind the DP
Print S _________________ Mark |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Fri Feb 22, 2019 10:19 pm Post subject: |
|
|
I was glad of hope but it stays with the scientific format:
Dim D as Double, Txt as string*16
D=0.1234567891234
Txt=str(D,
Print Txt
Output: 123.45678912E-3 |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Sat Feb 23, 2019 10:05 am Post subject: |
|
|
of course you can use a different number of DP. That way it will fit onto the LCD.
The double has a huge range and i wonder how you imagine that it would ever work without SN ?
My advise is to scale the result down to single or use integer math and insert your own DP. _________________ Mark |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Sat Feb 23, 2019 2:34 pm Post subject: |
|
|
I do not imagine that SN does not make sense for Double. But there are applications where SN disturbs a lot. And that's why config double=normal would make a lot of sense.
My application:
I'm reading the display of a precision DVM via GIPB interface. It delivers 7 digits. Because of the noise I'm doing an extensive statistics: average, standard deviation, linear regression and so on. Especially the average delivers about 8 digits resolution. That's why I have to calculate with double. So I would like an output with 8 digits and proper rounding.
Single deliver not exact 7 digits. For example
Singl=0.1234567: Print Singl 'Output: 0.123456652
Unfortunately, I must understand that there is no simple solution. I will have to create expensive own solutions. It is not easy, the full scale of the DVM goes from 0.2 to 20,000.
Thank you, Mark, for your effort. |
|
Back to top |
|
|
MWS
Joined: 22 Aug 2009 Posts: 2262
|
Posted: Sat Feb 23, 2019 5:45 pm Post subject: |
|
|
Walter wrote: | Unfortunately, I must understand that there is no simple solution. I will have to create expensive own solutions. |
Code: |
D = -2575.1545464785
' 10 more lines of code
Print dbl_str |
Result via print: -2575.1545464784
Time used up for writing this 'expensive solution' was bit more than half an hour LOL. |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Sat Feb 23, 2019 6:57 pm Post subject: |
|
|
Yes, I have already found a solution that is not too expensive. The multimeter has 6 different measurands and throughout 10 magnitudes of numbers. They are all different in the numeric display of the DVM. That is a total of 60 possibilities that need to be treated. To facilitate reading, only as many digits should be displayed as they are relevant.
My solution is: determine the measurand and magnitude. Determine from this the number of digits after the decimal point. Scale in Long (proposal by Mark), convert in String with Str() and insert the decimal point with Format(). |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Sat Feb 23, 2019 7:56 pm Post subject: |
|
|
Bascom is something special.
As I say, I want to do a correct rounding. Now I realize that Bascom is doing the rounding by itself in special cases, but not always.
Single1=123.6: Word1=Single1 'truncate, no rounding
Double1=123.6: Long1=Double1 'correct roundig
I was not expecting that. To my knowledge, each programming language will truncate the fraction in this case.
This is not described in the manual. It should be under Casting in Language Fundamentals. Without a test, I would have rounded twice and thus a wrong result.
Have I overlooked something? |
|
Back to top |
|
|
Walter
Joined: 14 Nov 2007 Posts: 18
|
Posted: Sun Feb 24, 2019 12:54 am Post subject: |
|
|
for the last topic I will open a new thread, because it does not belong here |
|
Back to top |
|
|
|