Best way to calculate fraction part of x?

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Steven D'Aprano-11
I have a numeric value, possibly a float, Decimal or (improper) Fraction,
and I want the fractional part. E.g. fract(2.5) should give 0.5.

Here are two ways to do it:

py> x = 2.5
py> x % 1
0.5
py> x - int(x)
0.5

x % 1 is significantly faster, but has the disadvantage of giving the
complement of the fraction if x is negative:

py> x = -2.75
py> x % 1
0.25


Are there any other, possibly better, ways to calculate the fractional part
of a number?




--
Steven



Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Skip Montanaro
On Mon, Mar 23, 2015 at 7:52 AM, Steven D'Aprano
<steve+comp.lang.python at pearwood.info> wrote:
> x % 1 is significantly faster, but has the disadvantage of giving the
> complement of the fraction if x is negative

I suppose

abs(x) % 1

would be just as slow as

x - int(x)

? (haven't checked)

Skip


Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Mark Lawrence
In reply to this post by Steven D'Aprano-11
On 23/03/2015 12:52, Steven D'Aprano wrote:

> I have a numeric value, possibly a float, Decimal or (improper) Fraction,
> and I want the fractional part. E.g. fract(2.5) should give 0.5.
>
> Here are two ways to do it:
>
> py> x = 2.5
> py> x % 1
> 0.5
> py> x - int(x)
> 0.5
>
> x % 1 is significantly faster, but has the disadvantage of giving the
> complement of the fraction if x is negative:
>
> py> x = -2.75
> py> x % 1
> 0.25
>
> Are there any other, possibly better, ways to calculate the fractional part
> of a number?
>

Any sparks here
http://stackoverflow.com/questions/875238/fractional-part-of-the-number-question 
?  I'm assuming that the reference to "pkaeding's algorithm" refers to
https://github.com/pkaeding but haven't confirmed that to be fact.

--
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence



Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Emile van Sebille
In reply to this post by Steven D'Aprano-11
On 3/23/2015 5:52 AM, Steven D'Aprano wrote:

> Are there any other, possibly better, ways to calculate the fractional part
> of a number?

float (("%6.3f" % x)[-4:])

Emile



Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Jason Swails
On Mon, Mar 23, 2015 at 8:38 PM, Emile van Sebille <emile at fenx.com> wrote:

> On 3/23/2015 5:52 AM, Steven D'Aprano wrote:
>
>  Are there any other, possibly better, ways to calculate the fractional
>> part
>> of a number?
>>
>
> float (("%6.3f" % x)[-4:])


?In general you lose a lot of precision this way...?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150324/c9848dd7/attachment.html>

Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Emile van Sebille
On 3/24/2015 6:39 PM, Jason Swails wrote:
>
>
> On Mon, Mar 23, 2015 at 8:38 PM, Emile van Sebille <emile at fenx.com

<snip>

>     float (("%6.3f" % x)[-4:])
>
>
> ?In general you lose a lot of precision this way...?
>

Even more if you use %6.1 -- but feel free to flavor to taste.   :)

Emile





Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Oscar Benjamin-2
In reply to this post by Steven D'Aprano-11
On 23 March 2015 at 12:52, Steven D'Aprano
<steve+comp.lang.python at pearwood.info> wrote:

> I have a numeric value, possibly a float, Decimal or (improper) Fraction,
> and I want the fractional part. E.g. fract(2.5) should give 0.5.
>
> Here are two ways to do it:
>
> py> x = 2.5
> py> x % 1
> 0.5
> py> x - int(x)
> 0.5
>
> x % 1 is significantly faster, but has the disadvantage of giving the
> complement of the fraction if x is negative:
>
> py> x = -2.75
> py> x % 1
> 0.25

The other version gives -0.75 in this case so I guess that's what you want.

> Are there any other, possibly better, ways to calculate the fractional part
> of a number?

What do you mean by better? Is it just faster?

To modify the % version so that it's equivalent you can do:

>>> x = -2.75
>>> (x % 1) - (x < 0)
-0.75

I'm not sure if that's faster than x - int(x) though. Obviously it
depends which numeric type you're primarily interested in.


Oscar


Reply | Threaded
Open this post in threaded view
|

Best way to calculate fraction part of x?

Russell Owen
In reply to this post by Jason Swails
On 3/24/15 6:39 PM, Jason Swails wrote:

>
>
> On Mon, Mar 23, 2015 at 8:38 PM, Emile van Sebille <emile at fenx.com
> <mailto:emile at fenx.com>> wrote:
>
>     On 3/23/2015 5:52 AM, Steven D'Aprano wrote:
>
>         Are there any other, possibly better, ways to calculate the
>         fractional part
>         of a number?
>
>
>     float (("%6.3f" % x)[-4:])
>
>
> ?In general you lose a lot of precision this way...?

I suggest modf in the math library:

math.modf(x)
Return the fractional and integer parts of x. Both results carry the
sign of x and are floats.