在MATLAB(r2009b)中,我有一个包含值2147484101的uint32变量.
这个数字(4字节)是在抓取过程中从数字机器视觉相机中提取的.根据我的理解,它具有相机快门速度的单精度形式(应接近1/260s = 3.8ms).
如何使用MATLAB中提供的内容将此32位数转换为IEEE单精度浮点表示?
对于变量n中提到的值,我尝试使用nn = dec2hex(n,16)和hex2num(nn)的组合.但似乎hex2num期望十六进制编码是双精度的而不是单一的,因为它在这里.至少我用这种方法得到了奇怪的数字.
有任何想法吗?
编辑:尝试@Matt的答案如下:
typecast(uint32(2147484101),'single') %# without swapbytes
typecast(swapbytes(uint32(2147484101)),'single') %# with swapbytes
Run Code Online (Sandbox Code Playgroud)
这使:
ans =
-6.3478820e-043
ans =
-2.0640313e+003
Run Code Online (Sandbox Code Playgroud)
我在http://www.h-schmidt.net/FloatApplet/IEEE754.html上尝试了IEEE 754转换器(JAVA applet).
使用:
format hex
typecast(uint32(2147484101),'uint8') %# without swapbytes
typecast(swapbytes(uint32(2147484101)),'uint8') %# with swapbytes
Run Code Online (Sandbox Code Playgroud)
给
ans =
c5 01 00 80
ans =
80 00 01 c5
Run Code Online (Sandbox Code Playgroud)
将这些字节输入applet(十六进制)给出了与MATLAB相同的数字.
我正在编写一个程序,其中我需要以非常高的精度(大约10^-10)存储数字,然后进一步使用它们作为参数(create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem))。
我能够获得的最高精度是double(周围的东西10^-6)这还不够。
我们如何在 c 中以更高的精度存储数字?
我正在尝试移植_controlfp(_CW_DEFAULT,0xffffffff); 从WIN32到Mac OS X/Intel.我完全不知道如何移植这条指令......你呢?谢谢!
我很清楚0和0.0(int和double)之间的区别.
但是0.和之间有什么区别0.0(请注意.)?
非常感谢提前,
阿克塞尔
我想为占用太多RAM的程序执行磁盘I/O操作.我使用双精度矩阵并考虑将它们写入磁盘,因为字节是最快的方式(我需要保持双精度).
如何做到便携?
我发现这个代码(这里),但作者说它不便携......
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ofstream ofs( "atest.txt", ios::binary );
if ( ofs ) {
double pi = 3.14;
ofs.write( reinterpret_cast<char*>( &pi ), sizeof pi );
// Close the file to unlock it
ofs.close();
// Use a new object so we don't have to worry
// about error states in the old object
ifstream ifs( "atest.txt", ios::binary );
double read;
if ( ifs ) {
ifs.read( reinterpret_cast<char*>( &read ), sizeof …Run Code Online (Sandbox Code Playgroud) 我在寻找有关快速GCD计算算法的信息.特别是,我想看看它的实现.
对我来说最有趣的是: - Lehmer GCD算法, - 加速GCD算法, - k-ary算法, - 带有FFT的Knuth-Schonhage.我完全没有关于加速GCD算法的信息,我刚看到一些文章,其中提到它是中等输入(~1000位)上最有效和最快速的gcd计算方法
从理论上看,我们很难理解它们.任何人都可以分享代码(最好是在c ++上)与列表中任何算法\部分的实现或分享任何经验.我将非常感谢任何信息,评论,建议,地方.我有一个使用大整数的类,但我没有方法可以使用它.当然,除了欧几里德和二进制gcd算法,我现在看起来很清楚; 这没有问题.我想在最后得到的主要内容:实现lehmer gcd的代码.(从列表中更容易)
algorithm complexity-theory computation double-precision greatest-common-divisor
为了比较C中的两个双重类型变量,我已经定义了#define EQUALITY_EPSILON = 1e-8.我正在进行如下比较:
if((img_score[i] - img_score[j]) >= EQUALITY_EPSILON){
// handle for ith score greater than jth score
}
else if((img_score[j] - img_score[i]) >= EQUALITY_EPSILON){
// handle for ith score smaller than jth score
}
else{
// handle for ith score equal to jth score
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我的代码中的分数非常小,因此EQUALITY_EPSILON = 1e-8,在某些情况下,比较的结果证明是相等的.我的问题是我可以设置多小EQUALITY_EPSILON?
如果我想在编译时在float和double精度之间切换,我应该在哪里看看.就像,如果用户想要浮动而不是双精度,我怎么能保持这种灵活性呢?换句话说,我应该如何有条件地定义一个可以是float或double精度的变量?
我有这个double价值:
var value = 52.30298270000003
Run Code Online (Sandbox Code Playgroud)
当我把它转换成它时string,它失去了它的精度:
var str = string.Format("{0} some text...", value);
Console.WriteLine(str); // output: 52.3029827
Run Code Online (Sandbox Code Playgroud)
我的值的精度数double可能会在运行时更改.如何强制该string.Format方法使用所有精度?
我正在尝试用 Fortran 重新编码旧的 C++ 程序以使用 LAPACK(我知道 C++ 确实有 LAPACK++,但我在安装它时遇到了很多麻烦,所以我放弃了)。
我最初没有任何编译问题,但那是当我将所有变量声明为REAL. 当我开始编写需要 LAPACK 的程序部分时,我发现传递给的所有参数都DSYEV需要是DOUBLE PRECISION. 因此,我尝试将所有内容更改为双精度(包括将所有硬编码数字更改为双精度对应数字,即 0.0 -> 0.0D0) 现在,当我尝试编译时,我得到的所有函数和子例程均出现以下错误已经写道:
Error: Return type mismatch of function <function> at (1) (REAL(4)/REAL(8))
Run Code Online (Sandbox Code Playgroud)
我不确定这是从哪里来的,因为程序中的所有内容都已更改为双精度。
例如,我声明了以下内容:
double precision :: alpha(3),d(3),zeta1,zeta2
double precision :: A1(3),A2(3),D1(3),D2(3)
double precision :: PI
PI = 3.14159265359D0
alpha = (/0.109818D0, 0.405771D0, 2.22766D0/)
d = (/0.444635D0, 0.535328D0, 0.154329D0 /)
do 10 i=1,3
A1(i) = alpha(i)*zeta1**2.0D0
A2(i) = alpha(i)*zeta2**2.0D0
D1(i) = d(i)*(2.0D0*A1(i)/PI)**(3.0D0/4.0D0)
D2(i) = d(i)*(2.0D0*A2(i)/PI)**(3.0D0/4.0D0)
10 continue …Run Code Online (Sandbox Code Playgroud)