Re: Most significant digit and formatting floating point output [message #81084] |
Wed, 08 August 2012 13:20 |
Helder Marchetto
Messages: 520 Registered: November 2011
|
Senior Member |
|
|
On Tuesday, August 7, 2012 5:37:31 PM UTC+2, Craig Markwardt wrote:
> On Tuesday, August 7, 2012 9:33:13 AM UTC-4, Helder wrote:
>
>> Dear all,
>
>>
>
>> well, I'm tangled up with something quite stupid, but I don't want to reinvent the wheel (for the 10th time today...).
>
>>
>
>> Here are two versions of the same question:
>
>>
>
>> 1) Short version: given a number such as 0.003456789 how do I get the most significant digit position? I need this number to produce formatted output that would convert the number to simply 0.003. In general I can figure this out with some IFs and stuff like that, but I'm hoping there is a more "elegant" way for this.
>
>>
>
>>
>
>>
>
>> 2) Long version: I'm analyzing some images and I get results with errors. These numbers are floating point and I would like to format the output so that it looks something like this: 'My results are (0.123 +/- 0.003) units' and the source data is:
>
>>
>
>> Result = 0.123456789
>
>>
>
>> Error = 0.003456789
>
>>
>
>> The point is that I need to find the first non-zero element in Error. Then I would use this number in the FORMAT parameter like this: MyFormat = '(f0'+STRTRIM(FirstNonZeroElement+2,2)+'.'+STRTRIM(FirstNonZ eroElement,2)+')'
>
>>
>
>> and use "MyFormat" as formatting for the string conversion of both.
>
>>
>
>> (in the above example FirstNonZeroElement should be 3 and MyFormat would be '(f05.3)'.
>
>
>
> ALOG10(ABS(X)) should give you this information. But to be general, you need to handle ABS(X) LT 1 and ABS(X) GT 1 separately. And also, the X LT 0 case demands one extra digit for the '-' symbol.
>
>
>
> Some extra rounding logic may be needed.
>
>
>
> Craig
Hi Craig,
thanks, that is what I was looking for.
Cheers,
Helder
|
|
|
Re: Most significant digit and formatting floating point output [message #81092 is a reply to message #81084] |
Tue, 07 August 2012 08:37  |
Craig Markwardt
Messages: 1869 Registered: November 1996
|
Senior Member |
|
|
On Tuesday, August 7, 2012 9:33:13 AM UTC-4, Helder wrote:
> Dear all,
>
> well, I'm tangled up with something quite stupid, but I don't want to reinvent the wheel (for the 10th time today...).
>
> Here are two versions of the same question:
>
> 1) Short version: given a number such as 0.003456789 how do I get the most significant digit position? I need this number to produce formatted output that would convert the number to simply 0.003. In general I can figure this out with some IFs and stuff like that, but I'm hoping there is a more "elegant" way for this.
>
>
>
> 2) Long version: I'm analyzing some images and I get results with errors. These numbers are floating point and I would like to format the output so that it looks something like this: 'My results are (0.123 +/- 0.003) units' and the source data is:
>
> Result = 0.123456789
>
> Error = 0.003456789
>
> The point is that I need to find the first non-zero element in Error. Then I would use this number in the FORMAT parameter like this: MyFormat = '(f0'+STRTRIM(FirstNonZeroElement+2,2)+'.'+STRTRIM(FirstNonZ eroElement,2)+')'
>
> and use "MyFormat" as formatting for the string conversion of both.
>
> (in the above example FirstNonZeroElement should be 3 and MyFormat would be '(f05.3)'.
ALOG10(ABS(X)) should give you this information. But to be general, you need to handle ABS(X) LT 1 and ABS(X) GT 1 separately. And also, the X LT 0 case demands one extra digit for the '-' symbol.
Some extra rounding logic may be needed.
Craig
|
|
|
Re: Most significant digit and formatting floating point output [message #81093 is a reply to message #81092] |
Tue, 07 August 2012 07:09  |
Helder Marchetto
Messages: 520 Registered: November 2011
|
Senior Member |
|
|
On Tuesday, August 7, 2012 3:44:05 PM UTC+2, David Fanning wrote:
> Helder writes:
>
>
>
>> well, I'm tangled up with something quite stupid, but I don't want to reinvent the wheel (for the 10th time today...).
>
>> Here are two versions of the same question:
>
>> 1) Short version: given a number such as 0.003456789 how do I get the most significant digit position? I need this number to produce formatted output that would convert the number to simply 0.003. In general I can figure this out with some IFs and stuff like that, but I'm hoping there is a more "elegant" way for this.
>
>>
>
>> 2) Long version: I'm analyzing some images and I get results with errors. These numbers are floating point and I would like to format the output so that it looks something like this: 'My results are (0.123 +/- 0.003) units' and the source data is:
>
>> Result = 0.123456789
>
>> Error = 0.003456789
>
>> The point is that I need to find the first non-zero element in Error. Then I would use this number in the FORMAT parameter like this: MyFormat = '(f0'+STRTRIM(FirstNonZeroElement+2,2)+'.'+STRTRIM(FirstNonZ eroElement,2)+')'
>
>> and use "MyFormat" as formatting for the string conversion of both.
>
>> (in the above example FirstNonZeroElement should be 3 and MyFormat would be '(f05.3)'.
>
>
>
> You might be interested in the Number_Formatter program
>
> in the Coyote Library:
>
>
>
> http://www.idlcoyote.com/programs/number_formatter.pro
>
>
>
> Cheers,
>
>
>
> David
>
>
>
>
>
>
>
> --
>
> David Fanning, Ph.D.
>
> Fanning Software Consulting, Inc.
>
> Coyote's Guide to IDL Programming: http://www.idlcoyote.com/
>
> Sepore ma de ni thui. ("Perhaps thou speakest truth.")
Thanks David,
If I understand number_formatter correctly, it accepts a number of decimals as an input, but it does not determine which one is the first significant digit.
I'm starting to think that I'll have to code this as in your program and look for the first digit that is not a zero or a dot.
Thanks,
Helder
|
|
|
Re: Most significant digit and formatting floating point output [message #81094 is a reply to message #81093] |
Tue, 07 August 2012 06:44  |
David Fanning
Messages: 11724 Registered: August 2001
|
Senior Member |
|
|
Helder writes:
> well, I'm tangled up with something quite stupid, but I don't want to reinvent the wheel (for the 10th time today...).
> Here are two versions of the same question:
> 1) Short version: given a number such as 0.003456789 how do I get the most significant digit position? I need this number to produce formatted output that would convert the number to simply 0.003. In general I can figure this out with some IFs and stuff like that, but I'm hoping there is a more "elegant" way for this.
>
> 2) Long version: I'm analyzing some images and I get results with errors. These numbers are floating point and I would like to format the output so that it looks something like this: 'My results are (0.123 +/- 0.003) units' and the source data is:
> Result = 0.123456789
> Error = 0.003456789
> The point is that I need to find the first non-zero element in Error. Then I would use this number in the FORMAT parameter like this: MyFormat = '(f0'+STRTRIM(FirstNonZeroElement+2,2)+'.'+STRTRIM(FirstNonZ eroElement,2)+')'
> and use "MyFormat" as formatting for the string conversion of both.
> (in the above example FirstNonZeroElement should be 3 and MyFormat would be '(f05.3)'.
You might be interested in the Number_Formatter program
in the Coyote Library:
http://www.idlcoyote.com/programs/number_formatter.pro
Cheers,
David
--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.idlcoyote.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
|
|
|