- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这可能是 bike-shedding ,但也许我遗漏了一些有趣的东西......
如果一个类初始化一个成员val
至 std::numeric_limits<double>::infinity()
后来想检查 val 是否已更改为有效的东西(+/- inf 在这里无效),这 3 种方法的权衡是什么,我是否错过了任何其他有趣的方法来解决这个问题。 (为了示例中的可读性,删除了 const。)
bool IsInit() { return MinX != std::numeric_limits<double>::infinity(); } // a
bool IsInit() { return !std::isinf(MinX); } // b
bool IsInit() { return std::isfinite(MinX); } // c
目前代码是 C++03,但选项将如何随着 C++11、C++14 和 C++17 发生变化。例如使用 C++17,此代码可能只是 std::optional<double> val
.或者如果 +/-inf 在将来变得有效,安静的 NaN 会是一个更安全的选择吗?
这是我在阅读此代码的补丁时出现的:
为了便于引用:
相关排序:
最佳答案
使用这些特殊值作为初始化标志只有在变量无法以其他方式获得特殊值时才有效。就数学运算而言,无穷大并不难得到,因为溢出也会得到它。所以这可能会有问题。如果唯一不变的是用户无法将此浮点值设置为此值,则使用安静的 NaN(如果可用)会更容易使用。
就三种方法而言,只有方法“a”与初始值完全匹配。因此,如果不变量是只有初始值代表初始化值,那么这是最准确的方法。当然,这些方法都没有从一开始就保护不变量做任何事情,我更关心的是:是否或可以有效地执行不变量。
虽然这不是一个代码审查网站,但就链接代码编辑到 OGREnvelope
而言github 上的类(看起来只是一个 AABB),我认为有几点需要注意:
IsInit
- 基于其代码 - 似乎意味着要返回 AABB 是否实际上已由用户设置。不是它是否处于可以说是 IsInit
的初始状态/值建议(并误导我相信)。我个人更喜欢 IsValid
这样的名字对于这个测试。MinX
。大于 MaxX
的值也不是 MinY
大于 MaxY
.换句话说,它们永远不应在有效的 AABB 中被逆转。 MinX
应始终小于或等于 MaxX
(对于最小和最大 Y 变量也是如此)。max()
范围更广的有效 AABB。和 lowest()
值(value)观会。MinX
的事实, MaxX
, MinY
, MaxY
成员变量可公开访问意味着 IsInit
不变量本身只是建议性的,因为没有封装来保护不变量。在注意到这些事情的更广泛背景下,NaN 是不合适的。不变量从来都不是真正的MinX != std::numeric_limits<double>::infinity()
.和 IsInit
(在该代码中实现)充其量是不完整的。在它被重命名为类似 IsValid
的上下文中,那么逻辑上更一致的实现是:
bool IsValid() const
{
return !std::isnan(MinX) && !std::isnan(MinY) && MinX <= MaxX && MinY <= MaxY;
}
通过此实现,有效的 AABB 是 OGREnvelope
其值都是有效数字(没有一个是 NaN)并且其最小值必须分别小于或等于 X 和 Y 的最大值。
关于c++ - val != std::numeric_limits<double>::infinity() 或 !isinf(val) 或 isfinite(val),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42930445/
如果我们看一下 C 语言的委员会草案:n1570尤其是关于复杂数学函数行为的 Annex G,我们可以看到复指数在无穷大处具有以下行为: cexp(+infinity+I*infinity)=+/-i
有人可以向我解释一下这是如何工作的吗?在查找最高数方法中,每个数字都大于 -Infinity。为什么它取最高数?与最小数字查找器相同,它如何选择最小数字,所有数字都小于 Infinity。 //fin
我想测试无穷大是否等于Java中的无穷大: Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY 当结果证明是真的时,我感到很惊讶。我的问题是两个无
我正在研究 JavaScript 的数字类型系统。 我正在使用 Chrome,当我为一个数字文字计算 15-- 时,我得到了一个 ReferenceError,因为递减一个常量是没有意义的。 当我按预
如果 Infinity === Infinity >> true 和 typeOf Infinity >> "number" 那是为什么 Infinity / Infinity >>NaN 而不是 1
问题很简单: Infinity == Infinity >> true Infinity == 1/0 >> true Infinity == Infinity == 1/0 >> false 为什么
据我所知,在数学中 Infinity 和 NaN 都是模糊值。众所周知: console.log(NaN == NaN); //-> false 同时 console.log(Infinity==In
我正在尝试创建一个选择查询,并过滤一个等于“无穷大”和“-无穷大”的日期时间字段: SELECT * FROM mytable WHERE dt = OR dt = 我该怎么做? 最佳答案 SEL
在一种情况下,我们必须在 Postgres 数据库中存储 +infinity 和 -infinity 的值? 应该考虑什么是合适的值? 如果没有,请提出最合适的替代方案。 最佳答案 您实际上可以将 +
这个问题在这里已经有了答案: Why is pow(-infinity, positive non-integer) +infinity? (1 个回答) 关闭4年前。 我尝试了两种不同的方法在 Ja
C99 附件 F(IEEE 浮点支持)是这样说的: pow(−∞, y) returns +∞ for y > 0 and not an odd integer. 但是,比方说,(−∞)0.5 实际上
在数学中,2 个无穷大既不等于,也不大于或小于 then。那么是什么给了? 在 irb 中,Float::INFINITY == Float::INFINITY(在 ruby 1.9.3 中测试)
文字未呈现在应用程序的主页上,这是我遇到问题的地方。我是新手,因此是新手。希望有人可以提供一些见解,或者根据我遇到的错误调整代码。 为了进一步说明,当我启动“ flutter ”时将显示此页面。将显示
为什么会这样: 1 === 1;// true 0 === -0;// true 1/0 === 1/-0;// false 原因: 1/0=Infinite; 1/-0=-Infinite; 问题:
我一直在试验冒泡排序代码,因为我最近开始了解 C 代码。但是,我无法将 NAN 输入到代码中,以便在构建和运行它时打印出来。我在使用 INFINITY AND -INFINITY 时遇到了同样的问题。
我使用 ANSI C89(不是 C++),我想生成 NaN、-Infinity 和 +Infinity。 有没有标准的方法(例如标准宏)?或者是否有任何独立于平台和编译器的方法来生成这些数字? flo
VB6 似乎并没有让将 +infinity、-infinity 和 NaN 存储到双变量中那么容易。如果可以的话,这会有所帮助,这样我就可以在复数的上下文中与这些值进行比较。如何? 最佳答案 一些不同
使这两个函数对于值 infinity 和 -infinity 表现不同的原因可能是什么。有没有人发现这种不一致有用? parseInt(Infinity); // NaN parseFloat(Inf
npc_objects = {}; TURKEYLENGTH = (Math.max.apply(Math, Object.keys(npc_objects))) + 1; console.log
我正在尝试制作一个程序,用莱布尼兹方程作为 pi 日的属性来估计 pi,但是控制台没有打印出我想要的估计 pi 值,而是无限次打印“无穷大”,直到我终止执行。我非常非常困惑,需要帮助!代码: im
我是一名优秀的程序员,十分优秀!