对于类型T为其中std::is_floating_point<T>::value的true,不C++标准规定上的任何方式T应实施?
例如,是否T甚至遵循符号/尾数/指数表示?或者它可以是完全随意的?
浮点是在C中定义的实现.因此没有任何保证.
我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受.出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的.
虽然我知道平台和架构之间可能存在关于long或的大小的差异wchar_t.但我似乎无法找到任何具体的float和double.
到目前为止我发现字节顺序可能在大端平台上被反转.虽然有不带浮动包含代码,其中点支撑平台float和double甚至无法链接.否则平台似乎坚持IEEE754单精度和双精度.
那么可以假设浮点数在IEEE754可用时安全吗?
编辑:回应评论:
你对"安全"的定义是什么?
安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序).
如果要模拟具有两个单精度浮点的双精度浮点,那么性能会是什么样的,并且可以做得好吗?
目前,Nvidia正在为双精度特斯拉卡充电,这使得您可以获得单精度性能的三分之一(值得注意的是Titan/Titan Black除外).
如果要使用具有gimped双精度的Geforce GPU并使用2个单精度浮点模拟双精度,性能会是什么样的?
虽然我知道(所以我被告知)浮点协处理器的工作速度比浮点运算的任何软件实现都快,但我完全没有直觉感觉这个差异有多大,按照数量级.
答案可能取决于应用程序和您的工作地点,微处理器和超级计算机之间.我对计算机模拟特别感兴趣.
你能指出这个问题的文章或论文吗?
的长双数据类型可以在C这些转换说明:%乐,%LE,%LF,%了Lg,%LG(参考).
我写了一个小程序来测试:
#include <stdio.h>
int main(void) {
long double d = 656546.67894L;
printf("%.0Le\n",d);
printf("%.0LE\n",d);
printf("%.0Lf\n",d);
printf("%.0Lg\n",d);
printf("%.0LG\n",d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-0
-4E-153
-0
-4E-153
-4E-153
但没有人能提供所需的输出,即656547(你可能很容易理解).是什么原因?
使用的编译器是gcc版本3.4.2(mingw-special).
int main()
{
int64_t iaVal = (int64_t)9007199258935295;
double daVal = (double)iaVal;
std::cout << "original " << iaVal << "\tAfter conversion " << (std::int64_t)daVal << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出 :
int main()
{
int64_t iaVal = (int64_t)9007199258935295;
double daVal = (double)iaVal;
std::cout << "original " << iaVal << "\tAfter conversion " << (std::int64_t)daVal << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如何从 double 中获得正确的值?