草庐IT

double_bits

全部标签

c++ - 精确为零的 float / double 相等

我有一个算法,它使用floats或doubles来执行一些计算。例子:doublea;doubleb;doublec;...doubleresult=c/(b-a);if((result>0)&&(result现在,我担心(b-a)可能为零。如果它接近于零但不为零,那没关系,因为result将超出有用范围,而且我已经检测到(如(b-a)接近零,result将接近+/-inf,这不在范围0-small_number...)但是如果(b-a)的结果恰好为零,我预计由于被零除会发生一些依赖于平台的事情。我可以将if语句更改为:if((!((b-a)==0.0))&&((result=c/(b

c++ - 将 double 分配给 const int& vs int 分配给 const int&

这个问题在这里已经有了答案:TemporaryinitializationandReferenceinitialization(3个答案)关闭4个月前。我试图理解C++中的常量引用,但我偶然发现了这个问题:当我将double分配给constint&然后更改引用double的值时,我的int引用的值保持不变。doublei=10;constint&ref=i;i=20;cout而在分配int时,值会发生变化。inti=10;constint&ref=i;i=20;cout这种行为的原因是什么?我的猜测是,在分配double时,隐式转换为int创建了一个新对象,然后分配了它的引用,但是我找

c++ - std:numeric_limits<double>::epsilon 定义

numeric_limits::espilon返回1和下一个double之间的差值。那么,我是否应该理解两个相邻double之间的距离并不总是相同,例如2和下一个double之间的距离?如果是,我可以解释一下吗? 最佳答案 随着离零越来越远,float的“密度”会很多。这是因为IEEEfloat本质上是以科学记数法存储的,因此范围优于统一精度。(如果是统一精度,那就是定点数,不是float。)换句话说,数字以Significand*2exponent的形式存储,因此如果指数变大,则significand的微小变化会导致数字(反之亦然

c++ - 错误 : invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘std::vector<bool>::reference {aka std::_Bit_reference}’

为什么我会收到错误:从类型为“std::vector::reference{akastd::_Bit_reference}”的右值对类型为“bool&”的非常量引用进行无效初始化?vector>vis;bool&visited(intx,inty){returnvis[x][y];//error}据我所知,vector中的operator[]返回引用,所以它应该是一个左值,但它不起作用。我应该怎么做才能让它发挥作用? 最佳答案 那是因为std::vector不是它看起来的样子。std::vector有一个特化与类型bool-它是空间

c++ - 将 std::vector<boost::optional<double>> 转换为 std::vector<double>

我有一个std::vector>,foo说。在这个特定的例子中,我需要一个std::vector其他vector中的任何“可选”元素映射到新vector中的0。我是否缺少针对此问题的单线解决方案?另一种选择是不尽如人意std::vectorout(foo.size());for(auto&it:foo){out.push_back(it?*it:0.0);}我欢迎基于std::optional的解决方案,即使我还没有使用该标准。 最佳答案 std::transform解决方案:std::vectorout(foo.size());s

c++ - 带大括号的 double 浮点初始化

为什么编译器(clang,gcc)在执行此操作时不警告缩小转换floata{3.1231231241234123512354123512341235123541235};floata={double(3.1231231241234123512354123512341235123541235)}我预计会收到警告,因为我使用大括号进行了显式值初始化。按照这个答案Link它应该吐出一个错误。Compilationhere 最佳答案 [dcl.init.list]/§7(标准草案)Anarrowingconversionisanimplic

c++ - 使用 accumulate 计算数组 double[] 平均值的函数

想必是最常见的功能吧,大家在某处都有一段代码,但我其实在SO以及其他C++网站上找了不下1.5小时,都没有找到解决办法。我想使用函数计算双数组[]的平均值。我想将数组作为引用传递给函数。有数百万个示例在main()循环中计算平均值,但我正在寻找的是一个函数,我可以将其放入外部文件并在以后随时使用它。到目前为止,这是我的最新版本,是什么导致了编译错误:doublemean_array(doublearray[]){intcount=sizeof(array)/sizeof(array[0]);doublesum=accumulate(array,array+count,0);return

c++ - IP 标志的 Don't Fragment Bit 在哪里使用?

我很想知道IP标志的“Don'tFragment”[DF]位在哪里使用。由于碎片对更高层是不可见的,他们也不在乎。我也在找例子。非常感谢。 最佳答案 碎片并不总是对所有上层不可见。一些早期的(甚至可能是当前的)微ControllerTCP/IP堆栈没有实现碎片处理等完整功能。在这种情况下使用标志将确保数据包以其原始形式到达,而不是另一端无法处理的大量片段。此外,当使用UDP时,不需要所有的片段都到达目的地,因此,防止片段化意味着消息要么到达要么没有到达——不可能只有UDP数据报的一部分会到达目的地。我不记得TCP/IP堆栈为等待丢失

c++ - 如何在 C++ 上的 "double"上使用按位运算符?

我被要求在C中获取不同类型的内部二进制表示。我的程序目前可以很好地处理“int”,但我想将它与“double”和“float”一起使用。我的代码如下所示:templatestringfindBin(Tx){stringbinary;for(inti=4096;i>=1;i/=2){if((x&i)!=0)binary+="1";elsebinary+="0";}returnbinary;}当我尝试使用“double”或“float”实例化模板时,程序失败。 最佳答案 简而言之,你不需要。按位运算符在应用于double时没有意义或fl

c++ - 为什么 complex<double> 上的 operator>> 在到达 EOF 时不设置 eofbit?

我正在尝试阅读尽可能多的std::complex尽可能从文件(或任何std::istream)。如果操作失败,我会检查ios::eof()。如果没有设置,我就假设解析数据有错误,我可以向用户报告输入文件有错误。这个方案适用于double,但不知何故它在复数上失败了。为什么?这里是重现问题的一些代码:std::istringstreamistr("41.2");std::complexval;while(istr>>val)std::cout输出是val=(4,0)val=(1.2,0)flags:eof=0fail=1bad=0如果我替换std::complex与double,它按预期