用C ++编写的Matlab类型

时间:2015-11-17 09:28:49

标签: c++ matlab

我正在尝试用C ++编写Matlab Type强制转换函数。在Matlab中,它如下:

>> format long e
>> d=typecast(uint32([65304 47886]), 'double')

d =

1.016138904784275e-309

HEX的位置为

0000bb0e0000ff18

在C ++中,我已经完成了这个

double d = 65304+ ((uint64_t)47886<<32);
std::cout << "d " << "is " <<  d << std::endl;

d  is 2.05669e+14

在HEX中,即0000bb0e0000ff18

那么,为什么我会得到不同的价值?

2 个答案:

答案 0 :(得分:2)

您并没有真正对结果进行类型转换,您只是进行类型转换,因此您获得的double值与整数值相同。

如果你想在MATLAB中做一个真正的typecast,你需要做这样的事情:

unsigned long i = 65304 + ((uint64_t)47886<<32);
// Make the double pointer address the same memory as the integer
double *d = (double *)&i;
std::cout << "d " << "is " <<  *d << std::endl;

问题在于您将遇到可移植性问题,因为此解决方案要求int类型中的位数精确地等于float类型中的位数。

结果(在我的机器上):

d is 1.01614e-309

答案 1 :(得分:1)

如果您查看C ++代码中的操作,您将看到只有两个整数值的总和:

double d = 65304 + ((uint64_t)47886<<32);
--> d = 65304 + 205668803936256;
--> d = 205668804001560

这是您在代码中获得的结果。因此,如果要将此值解释为藐蹦点号,则必须将此十六进制值转换为浮点编码

Double-precision floating-point format

也许演员阵容不足以取得你的成绩。而且你必须直接从十六进制格式中读取符号,指数和分数的位。