我想把一对一整副注解编码成双倍。例如,我想通过一个函数:
foo(int a, int b)
但我只想要一个双倍代表两点:
foo(double aAndB)
目前,我这样做的方法是在小数点位的两侧各有一英寸(即10和15将变为10.15),然后将其转换为弦流符号和提取这两个数字。
然而,在10和10之间,这显然有缺陷,它变成了10.1。
有没有办法通过一些复杂的数学方法来做到这一点? 这样我就能通过一个代表两英寸的双倍函数?
谢谢
我想把一对一整副注解编码成双倍。例如,我想通过一个函数:
foo(int a, int b)
但我只想要一个双倍代表两点:
foo(double aAndB)
目前,我这样做的方法是在小数点位的两侧各有一英寸(即10和15将变为10.15),然后将其转换为弦流符号和提取这两个数字。
然而,在10和10之间,这显然有缺陷,它变成了10.1。
有没有办法通过一些复杂的数学方法来做到这一点? 这样我就能通过一个代表两英寸的双倍函数?
谢谢
因为(通常)一个双倍有64位数, 而每英寸有32位数, 你就会认为你可以直接将这些位数存储在双倍数中, 例如 :
int32_t i1 = rand();
int32_t i2 = rand();
int64_t x = (((int64_t)i1)<<32) | ((int64_t)i2);
double theDouble;
memcpy(&theDouble, &x, sizeof(theDouble));
并且“ 几乎有效 ” 。 也就是说, 它对于许多可能的 i1 和 i2 值有效, 但对于所有这些值都无效。 特别是对于 IEEE 754 浮动点格式, 任何将指数位设为 0x7ff 的值都将被视为表示“ NAN ”, 而浮动点硬件可以(而且确实) 将不同的 NaN 等值位式比特式转换回其首选的 NaN 比特式, 当将双倍的比特式转换为 。
由于这个原因,把两个32位整数加到一个双倍中, 似乎在大多数情况下是有效的, 但如果你用所有可能的输入值测试它, 你会发现一些情况, 在它们停留在双倍中时, 其值突变, 当它们再次解码时, 它们作为不同的值出来。
当然,你只要小心地把曼特萨比特设置为双倍就可以绕过它,但这只能给您每整数26比特, 这样您只能存储 +/- 33, 554, 432 的整数值。 也许这样行得通, 取决于您使用的情况 。
我的建议是, 找到一种不同的方法来做任何你想做的事。 将非浮点数据存储在一个浮动点变量中会引起麻烦, 特别是如果您想要您的代码是便携式的话 。
如果你运气好,一整块是半倍 你可以储存这样的一整块:
int a = 10; int b = 20; double d; *(int *)&d = a; *((int *)&d + 1) = b; int outa = *((int *)&d); int outb = *(((int *)&d) + 1); printf("%d %d ", outa, outb);
这在一般/可移动性方面不起作用。 如果双元和元的位数与您想要的位数相同, 则不可能 。
双倍可以完全代表一个总计53位数的整数。 如果您想要持有一个 26 位数和一个 27 位数整数, 它很容易 : < code> 双倍组合 = bit27 * 67108864. 0 + bit26; code>
请注意,67108864是226。
尝试定义这样的联盟 :
struct two_int {
int a;
int b;
};
union encoding {
struct two_int a;
double c;
};
但这样做可能会给可移动性带来问题。 请双倍检查, 并用适合您案件的方法 。
您可以使用二进制面罩和从“双倍”中提取信息来做到这一点。
例如:
double encode(int a, int b)
{
double d = 0;
d = d | a;
d = d | (b << 8);
return d;
}
double decode(double d)
{
a = d & 0xFF;
b = (d >> 8) & 0xFF;
}
在编码部分,a 将在双变量 d, b 的低8位数中。
如果您总是将两个字移到这个参数上, 那么通过一个双字是没有道理的。 相反, 将两个字移到一个字, 或者将两个字移到一个柱状中 。
你这样做的方式使你没有机会发现真正的双倍和两点之间的差别。因此,我的结论是,通过做我上面描述的,你不会失去任何功能。
I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...
I have been searching for sample code creating iterator for my own container, but I haven t really found a good example. I know this been asked before (Creating my own Iterators) but didn t see any ...
Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...
I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?
Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...
Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...
I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...
Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?