On Fri, 8 May 2020, Artur Tarassow wrote:
Am 08.05.20 um 14:30 schrieb Allin Cottrell:
> On Fri, 8 May 2020, Artur Tarassow wrote:
>
>> I've stumbled over this weird thing trying to retrieve the day of Easter
>> Sunday applying the easterday() function as shown in the help text.
>>
>> However, it seems that scalar "d" is not a proper integer as trying to
>> restrict the sample to a single day fails with the error message "No
>> observations would be left!". Replacing "d" in the
"smpl" command by 5
>> works though. This is using latest git on Ubuntu 19.10.
>>
>> <hansl>
>> clear
>> set verbose off
>> nulldata 200
>> setobs 7 2015-01-01 --time-series
>>
>> series year, month, day
>> isoconv($obsdate, &year, &month, &day)
>>
>> scalar e = easterday(2015)
>> scalar m = floor(e)
>> scalar d = 100*(e-m)
> [...]
>
> Adding at this point
>
> printf "4.05 = %.15f\n", 4.05
> printf "d = %.15f\n", d
> eval d == 5
>
> reveals
>
> 4.05 = 4.050000000000001
> d = 4.999999999999983
> 0
>
> So round() will take d to 5, but not floor(). Hansl doesn't do integer
> arithmetic -- and couldn't in this case anyway since e = 4.05, coding for
> the 5th of April.
>
> It seems to me easterday() would be better returning a 2-vector holding
> month and day. As things stand you have to use round() on the day, or take
> this approach:
>
> edate = sprintf("%.2f", easterday(2015))
> scalar m, d
> sscanf(edate, "%d.%d", m, d)
> eval d == 5 # gives 1
Thanks for your alternative approach, Allin. Do you think your suggestion is
more reliable compared to the application of round() in this case, or are
there some edge-cases where round() may fail here? I've tried round() here
for a several years and it seems to work properly.
round() should be reliable for this job. In git I've revised the
help for easterday() accordingly.
Allin