From @|mon@urb@nek @end|ng |rom R-project@org  Thu Aug 12 05:52:27 2021
From: @|mon@urb@nek @end|ng |rom R-project@org (Simon Urbanek)
Date: Thu, 12 Aug 2021 15:52:27 +1200
Subject: [Rd] Double to uint64_t on M1
In-Reply-To: <EE649952-4BB6-432A-B3CA-BD9B11DD9324@gmail.com>
References: <EE649952-4BB6-432A-B3CA-BD9B11DD9324@gmail.com>
Message-ID: <C582D4F5-6218-42CC-AC63-50CAB13D977E@R-project.org>


Dipterix,

this has nothing to do with R. 2^63 is too large to be represented as singed integer, so the behavior is undefined - to quote from the C99 specs (6.3.1.4):

"If the value of the integral part cannot be represented by the integer type, the behavior is undefined."

Your subject doesn't match your question as the uint64_t conversion is well-defined and the same on both platforms, but the conversion to int64_t in undefined.

Cheers,
Simon


> On 12/08/2021, at 10:50 AM, Dipterix Wang <dipterix.wang at gmail.com> wrote:
> 
> Hi, 
> 
> I was trying to convert REALSXP to int64_t in C, then found that converting 2^63 is inconsistent across platforms:
> 
> 
> On M1 ARM osx, 2^63 (double) bit converting to `int64_t` becomes 9223372036854775807
> On x86_64 ubuntu server, 2^63 (double) bit converting to `int64_t` is -9223372036854775808
> 
> I was wondering if this is desired behavior to R?
> 
> Here's the code to replicate the results above.
> 
> print_bit <- Rcpp::cppFunction(r"(
> SEXP print_bit(SEXP obj){
> 
>  int64_t tmp1 = *REAL0(obj);
>  printf("%lld ", tmp1);
> 
>  return(R_NilValue);
> }
> )")
> 
> print_bit(2^63)
> 
> Thanks,
> - Dipterix
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 



[Rd] Double to uint64_t on M1
Simon Urbanek