小编dgu*_*uan的帖子

C++如何处理NAN?有标准方式还是编译器依赖?

在需要处理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. 这个'-1.IND'是什么意思?

  2. 似乎NAN处理依赖于编译器,这应该在C++中标准化吗?为什么?

  3. 我用这个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不同?

c++ floating-point nan

18
推荐指数
2
解决办法
2391
查看次数

怎么算24?

我写了一个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)

python algorithm

7
推荐指数
1
解决办法
1024
查看次数

使用std :: prev(vector.begin())或std :: next(vector.begin(), - 1)像some_container.rend()一样安全吗?

我编写了一些代码来获取迭代器,但是必须按相反的顺序进行比较,

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模式下没有边界检查.

我的问题是:

  1. std::prev(some_container.begin())像哨兵一样使用安全some_container.rend()吗?

  2. 我怎么能直接比较一个reverse_iteratoriterator?如果我编写代码: std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;它将无法编译,即使你是reinterpret_cast他们.

我很好奇,如果身体prev(some_container.begin())平等some_container.rend()吗?

c++ iterator c++11 reverse-iterator

7
推荐指数
2
解决办法
6087
查看次数

如何在 C++ 中找到底层文件类型?

在 *nix 系统中,有一个名为“file”的命令,它可以告诉您文件的底层类型。比如说,如果您将二进制可执行文件的名称重命名为 foo.txt,或者将 mp3 文件重命名为 .txt,系统将始终告诉您文件的真实类型。但在Windows中,似乎没有这样的功能,如果将可执行文件重命名为.txt,则无法执行它。谁能向我解释一下这是如何在 *nix 系统中完成的,以及如何使用 C++ 找到文件的真实类型,特别是在 Windows 中,我不能使用 std::system("file blah") ?

c++ linux windows

5
推荐指数
1
解决办法
523
查看次数

有没有办法让模板函数自动推导出迭代器的底层数据类型?

我有一个函数,我需要一个迭代器的底层数据类型作为返回类型,如下所示:

#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)

c++ templates iterator c++11

5
推荐指数
1
解决办法
258
查看次数

Python 2 与 3 正则表达式的区别

我有一个在 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)

python regex python-2.7 python-3.x

5
推荐指数
0
解决办法
1973
查看次数

这个新的c ++语法的名称是什么?

我刚看到一个新的C++语法,如:

x = "abc"s;
Run Code Online (Sandbox Code Playgroud)

从上下文我猜测这意味着x被分配了一个字符串"abc",我想知道这个新语法的名称,并且在C++ 1z中是否有任何类似的语法?

c++ c++11 c++17

2
推荐指数
1
解决办法
146
查看次数

在C/C++中,ZERO左移还是右移实际生成指令?

我不是很熟悉汇编语言或反汇编二进制代码,有人可以告诉我,如果"x << = 0;" 或"x >> = 0;" 会实际生成指令吗?

c c++ bit-manipulation bit

1
推荐指数
1
解决办法
843
查看次数