我在 Fortran 和 C++ 中分别实现了一个函数:
#include <math.h>
void dbl_sqrt_c(double *x, double *y){
*y = sqrt(*x - 1.0);
return;
}
Run Code Online (Sandbox Code Playgroud)
pure subroutine my_dbl_sqrt(x,y) bind(c, name="dbl_sqrt_fort")
USE, INTRINSIC :: ISO_C_BINDING
implicit none
real(kind=c_double), intent(in) :: x
real(kind=c_double), intent(out) :: y
y = sqrt(x - 1d0)
end subroutine my_dbl_sqrt
Run Code Online (Sandbox Code Playgroud)
我在编译器资源管理器中比较了它们:
Fortran:https : //godbolt.org/z/froz4rx97
C++:https : //godbolt.org/z/45aex99Yz
我阅读汇编程序的方式,它们基本上做相同的事情,但是 C++ 检查 sqrt 的参数是否为负,而 Fortran 则没有。我使用 googles 基准比较了它们的性能,但它们非常匹配:
--------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------
bm_dbl_c/8 2.07 ns 2.07 ns 335965892
bm_dbl_fort/8 2.06 ns 2.06 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用转换和浮点数转换到其他类型运行一些测试,我想将我的浮点变量设置为不同的nan值.
"IEEE浮点标准单精度(32位)NaN的一个逐步示例是:s111 1111 1axx xxxx xxxx xxxx xxxx xxxx其中s是符号(在应用程序中最常被忽略),a确定类型NaN和x是一个额外的有效载荷(通常在应用程序中被忽略).如果a = 1,它是一个安静的NaN;如果a是零且有效载荷是非零的,那么它是一个信令NaN"
基本上我想找到一种方法来设置表示的有效载荷或xxxx.有没有办法在c中这样做?
以下是:
double t = 244.233;
int a = (int) t;
Run Code Online (Sandbox Code Playgroud)
是不是未定义的行为,因为244可以适应内部int我做对了吗?否则,如果它是更大的值而不是244不适合内部int这将是未定义的,我做对了吗?
我对C如何做到这一点更感兴趣.但这种情况与C++有区别吗?