草庐IT

c++ - 在代码中使用 -DBL_MAX 安全吗?

我想要极端的值(value)。#includeusingnamespacestd;#include#include#include#defineTHRESHOLD2*DBL_MIN#defineFEQ(x,y)(fabs((x)-(y))那么,在代码中使用-DBL_MAX安全吗?如果有人知道更好的方法,请在此处分享。 最佳答案 DBL_MAX是标准库的一部分。因此,它并不是特别不安全。但是,从不可靠的意义上说,比较非整数浮点值是否相等本质上是不安全的。这是因为浮点运算的执行精度可能高于您选择的类型,结果会来回转换,并不总是如您所想。

c++ - gcc 在 abs 函数上的奇怪行为

我将一些代码从windows(vs2010)移植到gcc它的一部分看起来像:doubler1/*=somevalue*/;doubler2/*=somevalue*/;doublediff=abs(r1-r2);std::cerr它使用-Wall-Wextra在gcc(arm-linux-gnueabihf-g++(Raspbian6.3.0-18+rpi1+deb9u1)6.3.020170516)上编译,没有警告。结果是:0.121,0.0709839,00.015,0.131958,00.015,0.00799561,00.21,0.00799561,00.182,0.20599

c++ - RAND_MAX 的值总是 (2^n)-1 吗?

我对C++很感兴趣,尽管我怀疑它只是导入了C标准定义。我相信标准所说的答案是否定的,但我对实际答案最感兴趣。如果RAND_MAX始终为(2^n)-1(其中n是某个自然数-实际上是随机数中随机二进制数字的数量),这会简化处理最近从MinGW移动代码时出现的问题GCC到LinuxGCC。RAND_MAX似乎更大(我没有检查,但可能等于INT_MAX或任何符号),所以一些旧的天真编写的RAND_MAX-isn't-big-enough-so-work-around-it代码适得其反。现在我需要决定我需要这个库的通用性,考虑到编写正确处理溢出可能性的代码的繁琐程度而不对例如。int的宽度。无论

c++ - 编译器无法推断出 std::max 的重载

用我的编译器typedefconstdouble&(*fT)(constdouble&,constdouble&);typedefstd::functionstd_func;fTf1=std::max;//(1)std_funcf2=static_cast(std::max);//(2)std_funcf3=f1;//(3)(1,2,3)工作但是autof4=std::max;//(4)std_funcf5=std::max;//(5)(4,5)不要。编译器提示它无法为案例5选择重载。这种行为正常吗?什么是最便携最正确的写法? 最佳答案

c++ - 对 abs 的模糊调用

我有一个自定义数据类型,实际上可以是float或double.在除OSX之外的所有操作系统上,我都能够成功构建此C++11模板:#include#include#includetemplateinlineREAL_Tinhouse_abs(REAL_Ti_val){returnstd::abs((REAL_T)i_val);}intmain(){int32_tui=2;inhouse_abs(ui);return0;}但是,clang6.0(3.5LLVM)报告了一个不明确的函数调用。如果我改变abs至fabs,错误在OSX上得到解决,但现在在我的Linuxclang、gcc和Visu

c++ - 为什么 int a; a = std::max(a, x) 不发出 "uninitialized"警告

考虑以下代码:#include#include#includeintmain(){std::vectorv{{1,2,3}};inta;std::cout随着现代编译器的发展,现在对愚蠢的程序员错误保持警惕,他们跟踪单元化变量。然而,这段C++代码让他们感到困惑。到目前为止,我得到以下结果:(1)(2)g++5.3.1clang++3.7✔SolarisStudio12.5✔如您所见,CLang和solstudio只能检测情况(1)并忽略情况(2),而g++会忽略两者。在情况(2)中是否存在检测它的并发症?为什么g++在这方面如此糟糕?我使用的编译器选项:$g++-5-std=c++1

c++ - 为什么 iostream 定义了一个 abs 函数,我该如何停止它?

以下C++代码无法编译:intmain(){doublea=abs(5.1);return0;}当然,它会提示abs没有定义。但以下确实编译:#includeintmain(){std::cout它输出两个5(不是5.1)。出于很多原因,这很糟糕。首先,abs是一个非常自然和常用的函数,我一直都在使用它,但是int部分几乎从来不是我想要返回的。其次,对于我(或使用我的代码的人)来说太容易了,只写abs而没有注意到它编译但做了错误的事情,因为我(他们)真的很擅长忽略警告。第三,我只是不明白为什么iostream无论如何都要定义一个abs函数。第四,我真的不明白为什么它会进入全局命名空间。

c++ - max和fmax的区别(跨平台编译)

在Xcode中,这个编译很好:floatfalloff=fmin(1.0,fmax(0.0,distanceSqrd/cRadius));但是在VisualStudio2010中它会出错,我必须使用max而不是fmax。distanceSqrd和cRadius也是float。这是我的代码中唯一不能无缝交叉编译的部分...有什么想法吗? 最佳答案 函数std::fmax和std::fmin来自header(或fmax和fmin来自)是一个C++11功能以及VisualStudio2010尚不支持的许多其他新数学函数(也不支持2012)

c++ - 为什么 std::uniform_real_distribution::max() 返回独占上限?

我问的主要是出于学术兴趣。documentation表示std::uniform_real_distribution生成[a,b)范围内的数字,其中a和b是构造函数参数。由于上限是独占的,我希望.max()返回小于.b()的最大可表示值。但是我在GCC、Clang和MSVC上都得到了.b()==.max()。(对于float、double和longdouble。)为什么?#include#include#includeintmain(){autod=std::uniform_real_distribution(0,1);std::cout我找到了thisnote说一些常见的实现仅将[a

c++ - 使用按位运算符的 MAX 16 个字符字符串的 Strlen

挑战在于找到在C/C++中使用C中的按位运算确定C字符串长度的最快方法。charthestring[16];c字符串的最大长度为16个字符,并且位于缓冲区内如果字符串等于16个字符,则末尾没有空字节。我确定可以完成,但还没有做对。目前我正在处理这个问题,但假设字符串存储在零填充缓冲区中。len=buff[0]!=0x0+buff[1]!=0x0+buff[2]!=0x0+buff[3]!=0x0+buff[4]!=0x0+buff[5]!=0x0+buff[6]!=0x0+buff[7]!=0x0+buff[8]!=0x0+buff[9]!=0x0+buff[10]!=0x0+buff