在需要处理sin(x)/ x函数的程序中,我遇到了NAN问题,我简化了以下代码中的问题:
#include <iostream>
#include <cmath>
int main()
{
std::cout.precision(15);
//This line compiles and run in g++, but does not compile in Visual Studio 2013
std::cout << 0.0/0.0 << std::endl;
//This line compiles and run in both g++ and VS2013
std::cout << std::sin(0.0)/0.0 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在g ++中,输出为:-nan -nan,在VS2013中,输出为:-1.IND,因为第一行没有编译所以我把它注释掉了.
我的问题是:
这个'-1.IND'是什么意思?
似乎NAN处理依赖于编译器,这应该在C++中标准化吗?为什么?
我用这个hack来处理这个问题:
double sinc(double x)
{
if(x == 0.0)
return 1.0;
return std::sin(x)/x;
}
Run Code Online (Sandbox Code Playgroud)这是正确的方法吗?
编辑:另一个问题,4.为什么VS2013处理0.0/0.0和sin(0.0)/0.0不同?
我写了一个python脚本试图解决'计算24'问题,这个问题起源于一个游戏,从一副牌中抽取4张牌并尝试使用+, - ,*和/来获得值24.
该代码工作,只知道它有很多的重复,比如我输入2,3,4,5得到的24值,它会找到并打印2×(3 + 4 + 5)为24,但它也将打印2*(5 + 4 + 3),2*(5 + 3 + 4)等,同时它会发现4*(3 + 5 - 2),它也将打印4*(5 + 3 - 2).有人可以给我一些关于如何删除重复答案的提示吗?
代码如下:
def calc(oprands, result) :
ret=[]
if len(oprands)==1 :
if oprands[0]!=result :
return ret
else :
ret.append(str(oprands[0]))
return ret
for idx, x in enumerate(oprands) :
if x in oprands[0:idx] :
continue
remaining=oprands[0:idx]+oprands[idx+1:]
temp = calc(remaining, result-x) # try addition
for s in temp :
ret.append(str(x) + ' + ' + s)
if(result%x == 0) : # …Run Code Online (Sandbox Code Playgroud) 我编写了一些代码来获取迭代器,但是必须按相反的顺序进行比较,
template<class ConstBiIter>
bool func(ConstBiIter seq_begin, ConstBiIter seq_end)
{
ConstBiIter last = std::prev(seq_end);
while (--last != std::prev(seq_begin)) // --> I need to compare the beginning data
{
......
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
在VS2013中,当在调试模式下运行时,--last != std::prev(seq_begin)将导致调试器断言失败并显示错误消息
Expression:string iterator + offset out of range.
Run Code Online (Sandbox Code Playgroud)
但是在Release模式下运行并给出正确的结果是完全可以的,因为在Released模式下没有边界检查.
我的问题是:
std::prev(some_container.begin())像哨兵一样使用安全some_container.rend()吗?
我怎么能直接比较一个reverse_iterator用iterator?如果我编写代码:
std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;它将无法编译,即使你是reinterpret_cast他们.
我很好奇,如果身体prev(some_container.begin())平等some_container.rend()吗?
在 *nix 系统中,有一个名为“file”的命令,它可以告诉您文件的底层类型。比如说,如果您将二进制可执行文件的名称重命名为 foo.txt,或者将 mp3 文件重命名为 .txt,系统将始终告诉您文件的真实类型。但在Windows中,似乎没有这样的功能,如果将可执行文件重命名为.txt,则无法执行它。谁能向我解释一下这是如何在 *nix 系统中完成的,以及如何使用 C++ 找到文件的真实类型,特别是在 Windows 中,我不能使用 std::system("file blah") ?
我有一个函数,我需要一个迭代器的底层数据类型作为返回类型,如下所示:
#include <iostream>
#include <vector>
#include <iterator>
template<class T, class ForwardIterator>
std::vector<T> get_odd(ForwardIterator data_begin, ForwardIterator data_end)
{
std::vector<T> ret;
std::copy_if(data_begin, data_end, std::back_inserter(ret), [](int x) { return x % 2; });
return ret;
}
int main()
{
std::vector<int> vi { 1, 2, 3, 4, 5 };
for (auto i : get_odd<int>(vi.begin(), vi.end()))
std::cout << i << ", ";
std::cout << std::endl;
std::vector<unsigned int> vui{ 9UL, 8UL, 7UL, 6UL, 5UL };
// Note the 'char' I provided to the function, this will …Run Code Online (Sandbox Code Playgroud) 我有一个在 Python 2 中完美运行的正则表达式:
parts = re.split(r'\s*', re.sub(r'^\s+|\s*$', '', expression)) # split expression into 5 parts
Run Code Online (Sandbox Code Playgroud)
这个正则表达式将一个表达式分成 5 个部分,例如,
'a * b = c' will be split into ['a', '*', 'b', '=', 'c'],
'11 + 12 = 23' will be split into ['11', '+', '12', '=', '23'],
'ab - c = d' will be split into ['ab', '-', 'c', '=', 'd'],
Run Code Online (Sandbox Code Playgroud)
等等。
但是在 Python 3 中,这个正则表达式的工作方式完全不同,
'a * b = c' will be split into ['', 'a','', '*', '', 'b','', …Run Code Online (Sandbox Code Playgroud) 我刚看到一个新的C++语法,如:
x = "abc"s;
Run Code Online (Sandbox Code Playgroud)
从上下文我猜测这意味着x被分配了一个字符串"abc",我想知道这个新语法的名称,并且在C++ 1z中是否有任何类似的语法?
我不是很熟悉汇编语言或反汇编二进制代码,有人可以告诉我,如果"x << = 0;" 或"x >> = 0;" 会实际生成指令吗?