我读过关于浮点的内容,我知道NaN可能来自操作.但我无法完全理解这些概念是什么.有什么区别?
在C++编程期间可以生成哪一个?作为程序员,我可以编写一个程序来导致sNaN吗?
在C++中,我有一个保证,对于任何给定float a和float b,唯一的一个a < b,a == b而且a > b是真的吗?
如果这在编译器和平台之间有所不同,我对x86上的Visual C++感兴趣.
float f = (float)'a';
if(f < 0){
}
else if(f == 0){
}
else if(f > 0){
}
else{
printf("NaN\n");
}
Run Code Online (Sandbox Code Playgroud)
f0如果是a,则不会大于/等于/小于NaN.
但是如何f在第一时间产生这样的?
我尝试了各种方法来制作一个NaN,但没有工作..
我有一个看起来像这样的课程
struct A {
double a1;
int b1;
double a2;
int b2;
};
Run Code Online (Sandbox Code Playgroud)
我要读出一个文件值a1,b1,a2,和b2.大多数情况下,所有四个数字都在文件中,但有时只有两个数字.
当有两个数字时,我想将值存储在a1,b1并且我想在" a2和"中存储"无" b2.如果a2和b2为指针,我可以将它们分配是nullptr,但他们不是指针.
有什么我可以存储double和int变量,以表明"没有"存储?
我知道Boost.Optional是可用的,但我正在努力避免使用该库.
尝试将NaN分配给x64处理器上的变量
*dest = *(float*)&sourceNaN;
Run Code Online (Sandbox Code Playgroud)
哪里
unsigned char sourceNaN[] = {00,00, 0xa0, 0x7f};
Run Code Online (Sandbox Code Playgroud)
浮点指令fld和fstp(在反汇编中看到)将0xa0字节更改为0xe0.因此,目的地有一个额外的位设置.有人可以解释为什么会这样吗?这是一个Windows应用程序.
汇编语言代码:
005C9B9C mov eax,dword ptr [ebp+10h]
005C9B9F fld dword ptr [ebp-80h]
005C9BA2 fstp dword ptr [eax]
Run Code Online (Sandbox Code Playgroud) 有没有办法为模板类提供默认值?
比如说我有一个类TimeSeries,这是模板化的.我有一个叫做Foo()返回的函数T.
template <typename T>
class TimeSeries
{
T foo();
}
Run Code Online (Sandbox Code Playgroud)
我想做Foo()一些计算并返回类型的东西T.但如果它不能,我希望它给出一个默认值.如果T是的话double,我希望如此NaN.如果T是的话int,我希望如此0.
TimeSeries<double> t;
t.foo(); // returns NAN
TimeSeries<int> t;
t.foo(); // returns 0
Run Code Online (Sandbox Code Playgroud)
我怎么做到这一点?
一个糟糕的解决方案是Foo()采用默认值.
template <typename T>
class TimeSeries
{
T foo(T defaultValue)
{
T ret;
// if OK
ret = computeValue();
// if not OK
ret = defaultValue;
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
所以默认值是 …