问题标签 [rationale]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pandas-profiling - Pandas 分析工具用于识别重复行的方法是什么?
我正在寻找关于 pandas 分析工具用于识别重复行(在具有多列的数据框中)的方法的基本原理?我在 Pandas Profiling 文档中找不到它。
c++ - 为什么 C++ 的“使用命名空间”会以它的方式工作?
所有学生都对 C++ using-directives的行为感到惊讶。考虑这个片段(Godbolt):
你可能会认为test
会调用NA
's foo(Zoo::Lion)
; 但实际上它最终调用了N1
's foo(Zoo::Cat)
。
原因是它using namespace NA
实际上并没有将名称从当前范围中NA
引入;它将它们带入 and 的最不常见的祖先范围,即. 并且不会将名称带入当前范围;它将它们带入 and 的最不常见的祖先范围,即. 在这里,我画了一个漂亮的图表:NA
N2
::
using namespace N1
N1
N1
N2
NC
然后正常的非限定查找“查找”树,顺序为test
–<code>N2–<code>NC–<code>NB–<code>::,一旦foo
在NC
. 树上较高的 foo , inNB
和::
,没有通过查找找到,因为它们已被foo
in隐藏NC
。
我认为我对这种机制的理解足以解释它是如何工作的。我不明白为什么。在设计 C++ 命名空间时,他们为什么选择这种完全怪异的机制,而不是像“使用声明一样将名称带入当前范围”或“将名称带入全局范围”之类的更直接的东西还是“名称留在原处,在每个'使用'的命名空间中进行单独的查找,然后合并在一起”?
为 C++ 选择这种特殊机制时有哪些考虑?
我正在寻找有关 C++ 设计的参考资料——书籍、博客文章、WG21 论文、D&E、ARM、反射器讨论,以及任何类似性质的东西。我并不是在寻找“基于意见”的答案;我正在寻找设计该功能时指定的真正理由。
(我读过The Design and Evolution of C++ (1994),第 17.4 节“命名空间”,但它甚至没有提到这种古怪的机制。D&E说:“使用指令不会将名称引入本地范围;它只是使命名空间中的名称可以访问。”这是真的,但缺乏理由。我希望 StackOverflow 可以做得更好。)
c++ - 为什么要引入 `std::launder` 而不是让编译器处理它?
我刚读过
坦率地说,我只能摸不着头脑。
让我们从@NicolBolas 接受的答案中的第二个示例开始:
[basic.life]/8 告诉我们,如果在旧对象的存储中分配新对象,则无法通过指向旧对象的指针访问新对象。
std::launder
允许我们回避这一点。
那么,为什么不直接更改语言标准,以便data
通过 a进行访问reinterpret_cast<int*>(&data)
是有效/适当的呢?在现实生活中,洗钱是向法律隐瞒现实的一种方式。但我们没有什么可隐瞒的——我们在这里做的是完全合法的事情。std::launder()
那么,当编译器注意到我们正在data
以这种方式访问时,为什么不能将其行为更改为它的行为呢?
上第一个例子:
因为 X 是微不足道的,我们不需要在创建一个新对象之前销毁旧对象,所以这是完全合法的代码。新对象的 n 成员将为 2。
所以告诉我...什么会
u.x.n
返回?显而易见的答案是 2。但这是错误的,因为允许编译器假设一个真正的
const
变量(不仅仅是一个 const&,而是一个声明的对象变量const
)永远不会改变。但我们只是改变了它。
那么为什么不让编译器在我们编写这种代码时不允许做出假设,通过指针访问常量字段呢?
为什么让这个伪函数在形式语言语义上打一个洞是合理的,而不是根据代码是否像这些示例中那样将语义设置为它们需要的语义?
format - IEEE 754:格式的基本原理:次正规数和正规数
有人可以澄清一下:
- 为什么次正规数的格式究竟是
±(0.F) × 2^-126
而不是±(1.F) × 2^-127
? - 为什么正常数字的格式是:
±(1.F) × 2^exp
而不是说±(11.F) × 2^exp
,或者说,±(10.F) × 2^exp
?
floating-point - 理解 IEEE 754:为什么 convertFromInt 和 convertToIntegerXXX 被归类为算术运算而不是转换运算?
注意:了解 IEEE 754。请耐心等待。
IEEE 标准 754-2019:
5.4.1 算术运算
― formatOf-convertFromInt(int)
― intFormatOf-convertToIntegerXXX(来源)
问题:为什么convertFromInt
和convertToIntegerXXX
被归类为算术运算而不是转换运算?
UPD。问题的原因:
C11(强调添加):
5.2.4.2.2 浮动类型的特点<float.h>
3 一个安静的 NaN在几乎所有 _arithmetic 运算中传播,而不会引发浮点异常;当作为算术操作数出现时,信号 NaN 通常会引发浮点异常。
根据 IEEE 754(2008 年和 2019 年)convertFromInt
,convertToIntegerXXX
被归类为算术运算而不是转换运算。
根据 C11(强调添加):
F.4 浮点数到整数的转换
1 ... 否则,如果浮点值是无穷大或NaN,或者如果浮点值的整数部分超出整数类型的范围,则引发''invalid''浮点异常并且结果值未指定. ...
这里NaN不是特化的,因此,我们得出结论,这里的NaN是任何 NaN。
还有C11(强调添加):
F.3 运算符和函数
<math.h> 中的 lrint 和 llrint 函数提供 IEC 60559转换... lrint 和 llrint 函数可用于实现从浮点到其他整数格式的 IEC 60559 转换。
但是,根据 IEEE 754(2008 年和 2019 年)convertFromInt
并被convertToIntegerXXX
归类为算术运算而不是转换运算。
总而言之:我很困惑。我看到了 C11 和 IEEE 754 之间的矛盾。
代码示例:
这里:
- IEEE 754 说:
convertToIntegerXXX
被归类为算术运算AND C11 说:安静的 NaN 在几乎所有算术运算中传播而不会引发浮点异常。 - C11 表示:如果浮点数为无穷大或 NaN 或浮点数的整数部分超出整数类型的范围,则引发''invalid''浮点异常`。
核心问题:会l = (long)NAN
导致提高FE_INVALID
吗?
额外问题:IEEE 754:是否被convertFromInt
错误convertToIntegerXXX
地归类为算术运算而不是被归类为转换操作?
UPD20211110:似乎 IEEE 754 确实错误地对它们进行了分类。对于l = (long)NAN
x86_64 的 clang 13.0.0 生成cvttss2si
,这会引发无效浮点异常。注意:gcc 11.2 仍然忽略#pragma STDC FENV_ACCESS
.
android - React Native Permission 基本原理未显示
我在反应本机许可理由方面遇到了麻烦。虽然我已经把它放在我的代码中,但它没有显示出来。
不显示的问题是什么?谢谢您的帮助。
logging - 为什么要使用“%c”在日志中格式化日期?
一段广泛使用的代码将默认设置datefmt
为.logging.Formatter
"%a %b %d %H:%M:%S %Y %Z"
该代码是 12 年前编写的,作者不可用。
我以前从未见过这样的日志格式。我觉得"%Y-%m-%d %H:%M:%S"
更方便(它按时间顺序排序与字典顺序相同,并且更短)。我试图弄清楚可能的理由是什么。
谢谢你。
c - 从实数浮点数到整数的转换是否需要将该值截断为零以方便将代码从 Fortran 移植到 C?
C11, 6.3.1.4 实数浮点数和整数:
当实浮点类型的有限值转换为_Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。
“值被截断为零”的理由是什么?例如,为什么不“四舍五入到最接近的整数值,中间情况四舍五入为偶数”(IEEE 754,convertToIntegerTiesToEven(x)
)?
来自文档“国际标准的基本原理——编程语言——C”,修订版 5.10,2003 年 4 月:
6.3.1.5 真正的浮点类型(强调):
由于在前一种情况下,向零截断是 C 的适当设置,因此要求此类实现舍入以浮动会很昂贵。
6.5.5 乘法运算符(强调):
在 C89 中,涉及负操作数的整数除法可以以实现定义的方式向上或向下舍入;目的是避免在运行时代码中产生开销,以 10 检查特殊情况并强制执行特定行为。然而,在 Fortran 中,结果将始终向零截断,并且开销似乎对于数值编程社区是可以接受的。因此,C99 现在需要类似的行为,这应该有助于将代码从 Fortran 移植到 C。