小编Joh*_* Li的帖子

浮点 sqrt() 函数是否保证顺序关系

给定两个浮点数 x 和 y,假设所有浮点运算都符合 IEEE754 标准,以及平方根函数 sqrt() 的某种实现,

  1. 如果 x < y,sqrt(x) <= sqrt(y) 是否一定成立?
  2. 如果 sqrt(x) < sqrt(y),那么 x <= y 是否一定成立?

设 a、b 是两个(精确)实数,并且 x = op(a)、y = op(b),其中 op() 表示将实数舍入为其浮点表示形式。那么下面的问题:(*表示浮点乘法)

  1. 如果 a< b,则 sqrt(x) <= sqrt(y) 是否一定成立?
  2. 如果 sqrt(x)*sqrt(x) < sqrt(y)*sqrt(y),则 a <= b 必须成立。

如果对于上述部分或全部问题,答案是否定的,那么

  • 你知道 sqrt() 的任何实现可以保证 1 和 2 吗?
  • 给定将实数截断为浮点数的特定舍入规则,您知道 sqrt() 的任何实现可以保证 3 和 4 吗?

floating-point precision floating-accuracy

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

make_shared与enable_shared_from_this不一起玩?

考虑以下两个代码片段,第一个:

#include "pch.h"
#include <memory>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class tcp_connection : public std::enable_shared_from_this<tcp_connection>
{
public:
    typedef std::shared_ptr<tcp_connection> pointer;

    static pointer create(boost::asio::io_service& io_service)
    {
        return pointer(new tcp_connection(io_service));
        //second example only differs by replacing the above line with the below one
        //return std::make_shared<tcp_connection>(io_service);
    }

private:
    tcp_connection(boost::asio::io_service& io_service) //private constructor
        : socket_(io_service)
    {
    }
    tcp::socket socket_;
};

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二个与第一个不同,只有一行,即注释行.

使用MSVC 2017和boost :: asio 1.68,第一个版本按预期工作,而第二个版本不编译,吐出错误,例如"不允许不完整类型tcp_async".

我的问题是:

  1. 这是因为std :: make_shared不能与std:std :: enable_shared_from_this一起玩吗?
  2. 或者,这是因为asio持有关于如何实现std :: make_shared或std :: enable_shared_from_this的假设,并不适用于MSVC 2017.
  3. 或者它是另一回事?

c++ shared-ptr boost-asio

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

共享指针和具有自定义删除器的唯一指针之间的语法差异背后的任何原因

虽然 C++11 中的共享指针和唯一指针都允许用户定义删除器,但它们有显着的语法差异,如下面的小示例所示:

#include "pch.h"
#include <memory>
class factory
{
public:
    static factory * create() {
        return new factory();
    }
    static void destroy(factory*    fp) noexcept{
        delete fp;
    }
    factory(const factory &) = delete;
    factory& operator= (const factory &) = delete;
private:
    char * p_;
    factory() {
    p_ = new char[100];
    }
    ~factory() {
        delete[] p_;
    }
};

int main()
{
    typedef void(*fp)(factory*);

    auto del = [](factory * p) noexcept {
        factory::destroy(p);
    };

    std::shared_ptr<factory> fsptr1(factory::create(), del);
    std::shared_ptr<factory> fsptr2(factory::create(), del);
    //notice the …
Run Code Online (Sandbox Code Playgroud)

c++ pointers smart-pointers

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

std :: tuple_size &lt;std :: array&gt;的目的是什么?

关于的帮助班std::tuple_size<std::array>,我有两个问题std::array

首先,类中有一个constexpr size()成员函数std::array,为什么需要一个std::tuple_size<std::array>

第二,这个名字是否tuple_size令人误解?

c++ stdarray

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

位字段如何与C中的位填充相互作用

当存在填充位时,我有两个关于位字段的问题。

说我有一个结构定义为

struct T { 
    unsigned int x: 1; 
    unsigned int y: 1;
};
Run Code Online (Sandbox Code Playgroud)

结构T仅实际使用了两位。

问题1:这两位始终是基础无符号int的最低有效位吗?还是取决于平台?

问题2:那些未使用的30位是否总是初始化为0?C标准对此有何评论?

c struct bit-manipulation language-lawyer

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

pthread_cancel()是否可能终止另一个意外线程?

我的问题与类似。但是在查看了所有答案之后,我仍然不知道pthread_cancel()可以提供什么样的安全保证。所以我想问一个更具体的问题:

假设在名为my_thread的pthread_t变量上调用了pthread_cancel(),那么有可能在执行pthread_cancel(my_thread)时,已经以某种方式终止了与my_thread对应的实际线程,并且内核将my_thread的值回收用于另一个新创建的线程,例如通过执行pthread_cancel(my_thread),另一个意外线程被杀死了?

c posix pthreads

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

宏参数的目的是什么似乎没用(参见下面的代码)

在BSD系统的头文件queue.h中,有以下宏

#define TAILQ_ENTRY(type, qual)\
struct {\
    qual type *tqe_next;        /* next element */\
    qual type *qual *tqe_prev;  /* address of previous next element */\
}
Run Code Online (Sandbox Code Playgroud)

根据上面的定义,人们应该使用它

struct foo {
    TAILQ_ENTRY(struct foo, ) my_list;
    //some data here
};
Run Code Online (Sandbox Code Playgroud)

我的问题是:这里的宏参数"qual"的目的是什么,似乎在代码生成中没有任何作用.

c macros bsd

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