[Gambas-user] gb3: "Mathematic error"

Benoît Minisini gambas at ...1...
Tue Jan 17 16:22:45 CET 2012


Le 17/01/2012 11:35, Kevin Fishburne a écrit :
> On 01/17/2012 05:18 AM, Kevin Fishburne wrote:
>> On 01/16/2012 02:33 AM, Benoît Minisini wrote:
>>> Le 16/01/2012 08:05, Kevin Fishburne a écrit :
>>>> On 01/16/2012 01:43 AM, Kevin Fishburne wrote:
>>>>> Why would I get the runtime error "Mathematic error" in this function:
>>>>>
>>>>> Public Function Distance(x1 As Single, y1 As Single, x2 As Single, y2 As
>>>>> Single) As Single
>>>>>         Return Abs(Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)))
>>>>> End
>>>>>
>>>>> The values of the variables are:
>>>>>
>>>>> ?x2&      ""&      x1&      ""&      x2&      ""&      x1&      ""&      y2&      ""&      y1&      ""&      y2&
>>>>> ""&      y1
>>>>>
>>>>> 174.248779296875 2.40799128109576E-41 174.248779296875
>>>>> 2.40799128109576E-41 146.759170532227 7.19552647834628E+27
>>>>> 146.759170532227 7.19552647834628E+27
>>>>>
>>>>> Using GAMBAS 3, revision unknown. I'm recompiling now to see if it makes
>>>>> a difference, but please let me know what this error means and what
>>>>> could cause it.
>>>>>
>>>> I changed the first line (old one) to the second:
>>>>
>>>> 'Return Abs(Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)))
>>>> Return Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
>>>>
>>>> and it gives me no problems. Seems like I really screwed up the distance
>>>> calculation, but even so this may be a bug so hopefully I've contributed
>>>> to a solution. Still curious of course as to what the error might mean.
>>>> Maybe it should just say "You suck at math." :)
>>>>
>>> You get a mathematic error because of an overflow. (y2 - y1) * (y2 - y1)
>>> cannot be expressed by a Single in your example.
>>>
>>> The "^" operator deals with Float internally, so you don't get an error.
>>>
>>> Anyway, to compute a distance, you can use the Hyp() or the Mag()
>>> function. It will be faster.
>> Sometimes it calculates without error, other times it doesn't. Changing
>> all the datatypes to float doesn't make any difference either. Thanks
>> for the efficiency tip on Hyp() and Mag(), but it still looks like
>> there's a problem with math here. How should a manual distance
>> calculation be expressed without overflow if that's the problem?
>>
>
> Just discovered it has to do with one of the passed values being zero.
> Why is that?
>

Apparently you are not shocked by a coordinate of 7.19E+27... That 
causes the overflow with Single (not Float).

-- 
Benoît Minisini




More information about the User mailing list