[ncl-talk] commands to handle exponential calculation to return E100 instead of infinity

Yi-Chih Huang dscpln at gmail.com
Wed Apr 26 22:53:41 MDT 2017


Hello,

    I have do loop as follow.  The b12^log(L(j,k)) is very small
about exp(-80).  What is a suitable way to make NCL handle this
calculation, rather than return 0?

    do k= 0,dt(2)-1
    do j= 256,511
       if (th(9,j,k).gt.357.5 .and. th(9,j,k).le.362.5) then
          qt(j,k) =
b10*b11^log(C(j,k))*b12^log(L(j,k))*b13^log(ht(j,k))*b14^log(ht(j,k))*b15^log(N(j,k))
           ....................

    Thanks,

                         Yi-Chih

On Thu, Apr 27, 2017 at 12:08 PM, Rick Brownrigg <brownrig at ucar.edu> wrote:

> Hi Yi-Chih,
>
> I am not sure what you mean by "...But b12^log(L(j,k))d in the do loop is
> not working...".
>
> But hopefully to clarify, NCL is a typed language, so that:
>
> 1    ; is an integer
> 1.   ; is a float
> 1d  ; is a double
> 1.d ; is a double
>
> and in general, unless the documentation states otherwise, many functions
> in NCL are integer-in/integer-out, float-in/float-out, etc.
>
> So if in your example, "L(j,k)" is a float value, "log(L(j,k))" will be a
> float value, and subject to the valid range of floats.  Going back to your
> original example:
>
>    b10 =  todouble(exp(230.84))
>
> 230.84 is a float value, and exp(230.84) will be a float value that
> happens to exceed the valid range of floats. To coerce the result to
> double, you'll want:
>
>    b10 = exp(todouble(230.84))    ;; which is equivalent to "exp(230.84d)"
>
> Hope that helps...
> Rick
>
>
>
>
>
> On Wed, Apr 26, 2017 at 8:27 PM, Yi-Chih Huang <dscpln at gmail.com> wrote:
>
>> Hello,
>>
>>     The exp(230.84d) is working.  But b12^log(L(j,k))d in the do loop is
>> not working.  What would be the command to handle extreme large or extreme
>> small numbers in do loop?
>>
>>     Thanks,
>>
>>                Yi-Chih
>>
>>
>> On Thu, Apr 27, 2017 at 1:34 AM, Rick Brownrigg <brownrig at ucar.edu>
>> wrote:
>>
>>> This yields a float result, which is out of range for floats:
>>>
>>> b10   = exp(230.84)
>>> b20   = exp(203.22)
>>>
>>> Try explicitly making the constants double:
>>>
>>> b10   = exp(230.84d)
>>> b20   = exp(203.22d)
>>>
>>>
>>> On Wed, Apr 26, 2017 at 5:27 AM, Yi-Chih Huang <dscpln at gmail.com> wrote:
>>>
>>>> Hello,
>>>>
>>>>     I work on NCL Version 6.1.2.  It said the range of double type is
>>>> e-308 - e+307 on https://www.ncl.ucar.edu/Do
>>>> cument/Manuals/Ref_Manual/NclDataTypes.shtml.  Although I have tried
>>>> several ways, I only got infinity and 8 bits in return.  Could you show me
>>>> the command to handle exponential calculation
>>>>
>>>>
>>>> b10   = todouble(exp(230.84))
>>>> b20   = todouble(exp(203.22))
>>>> b30   = new(1,double,0)
>>>> print(b10+"  "+b20+"  "+b30)
>>>>
>>>> Variable: b30
>>>> Type: double
>>>> Total Size: 8 bytes
>>>>             1 values
>>>> Number of Dimensions: 1
>>>> Dimensions and sizes:   [1]
>>>> Coordinates:
>>>>
>>>> (0)     inf  inf  inf
>>>>
>>>> $ ncl -v
>>>> Unknown option `-v'
>>>>  Copyright (C) 1995-2013 - All Rights Reserved
>>>>  University Corporation for Atmospheric Research
>>>>  NCAR Command Language Version 6.1.2
>>>>  The use of this software is governed by a License Agreement.
>>>>  See http://www.ncl.ucar.edu/ for more details.
>>>>
>>>>     Thanks much,
>>>>
>>>>                      Yi-Chih
>>>>
>>>> _______________________________________________
>>>> ncl-talk mailing list
>>>> ncl-talk at ucar.edu
>>>> List instructions, subscriber options, unsubscribe:
>>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20170427/3dec80bc/attachment.html 


More information about the ncl-talk mailing list