Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20240612154410.GU10433@brightrain.aerifal.cx>
Date: Wed, 12 Jun 2024 11:44:10 -0400
From: Rich Felker <dalias@...c.org>
To: Meng Zhuo <mzh@....io>
Cc: musl@...ts.openwall.com
Subject: Re: [PATCH v3] math: add riscv64 round/roundf

On Wed, Jun 12, 2024 at 11:31:05PM +0800, Meng Zhuo wrote:
> ---
> v2 -> v3:
>  * use x + x to check +-inf and NaN
> ---
> v1 -> v2:
>  * drop ±inf check and use fabs as Rich suggested
> ---
>  src/math/riscv64/round.c  | 21 +++++++++++++++++++++
>  src/math/riscv64/roundf.c | 21 +++++++++++++++++++++
>  2 files changed, 42 insertions(+)
>  create mode 100644 src/math/riscv64/round.c
>  create mode 100644 src/math/riscv64/roundf.c
> 
> diff --git a/src/math/riscv64/round.c b/src/math/riscv64/round.c
> new file mode 100644
> index 00000000..28d05aed
> --- /dev/null
> +++ b/src/math/riscv64/round.c
> @@ -0,0 +1,21 @@
> +#include <math.h>
> +
> +#if __riscv_flen >= 64
> +
> +double round(double x)
> +{
> +	if (isnan(x + x)) return x; // if x is +-inf or nan
> +	if (fabs(x) >= 0x1p54) return x;

Why? I already gave you a single expression that covers all these
cases if you don't care about raising INVALID (I don't recall if
that's allowed here):

	if (!(fabs(x) < 0x1p54)) return x;

Your new x+x *does* raise INVALID, so it has no advantages.

If the function needs to avoid raising INVALID, you need to check
isnan(x) (or !isfinite(x) is probably better) separately like you were
doing. We need to check this.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.