我想在C++中计算以下形式的总和
float result = float(x1)/y1+float(x2)/y2+....+float(xn)/yn
Run Code Online (Sandbox Code Playgroud)
xi,yi都是整数.结果将是实际值的近似值.至关重要的是,该近似值小于或等于实际值.我可以假设我的所有价值观都是有限的和积极的.我尝试使用nextf(,0),就像在此代码段中一样.
cout.precision( 15 );
float a = 1.0f / 3.0f * 10; //3 1/3
float b = 2.0f / 3.0f * 10; //6 2/3
float af = nextafterf( a , 0 );
float bf = nextafterf( b , 0 );
cout << a << endl;
cout << b << endl;
cout << af << endl;
cout << bf << endl;
float sumf = 0.0f;
for ( int i = 1; i <= 3; i++ ) …Run Code Online (Sandbox Code Playgroud) c++ floating-point precision rounding floating-point-precision
引用C++草案N4713:
每个程序应该只包含每个非内联函数或变量的一个定义,该函数在该程序中在废弃语句之外使用(9.4.1); 无需诊断.该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见15.1,15.4和15.8).内联函数或变量应在每个翻译单元中定义,在翻译单元中,在废弃的语句之外使用它.
在C++ 17之前的C++版本中,我可以通过声明我的函数来解决这个限制inline.C++ 17为变量添加了相同的功能.
此外,在我看来,inline除了可以忽略ODR之外,-Keyword不会用于其他目的.
那么,为什么整个规则不会因为C++ 17而放弃呢?我无法看到可以关闭的规则的目的.
我正在使用org.xml.sax中的SAX解析器解析XML文件.我实现的只不过是startElement和endElement方法.
有时"text text \n text"需要解析行.
解析器将它们转换为"text text \\n text".我不希望这样.是否可以在不自行操作字符串的情况下阻止解析器进行此类调整?
我检查了api的Defaulthandler类,但没有找到任何东西.
最好的里卡多
考虑以下代码.
class aClass
{
public:
static const int HALLO = -3;
};
int main()
{
std::vector<double > a;
std::vector<int> b;
std::vector<int> c;
int d = aClass::HALLO; //fine
a.resize(10,aClass::HALLO); //fine
b.resize(10,aClass::HALLO); // linker error c++11 and c++14
c.resize(10,(int)(double)aClass::HALLO); //fine
std::cout<<a[0]<<endl;
std::cout<<b[0]<<endl;
std::cout<<c[0]<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译与C++ 03一起使用并产生输出:
-3
-3
-3
Run Code Online (Sandbox Code Playgroud)
但是,使用C++ 11或C++ 14进行编译会导致链接器错误:
/tmp/cc3BARzY.o: In Funktion `main':
main.cpp:(.text+0x66): Nicht definierter Verweis auf `aClass::HALLO'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这只发生在矢量上b.如果有一个强制转换为double(a)或甚至是double并返回到int(c),则代码按预期运行.
如何解释这种行为?