我试图更好地理解浮点运算,并且已经看到了"每个计算机科学家应该知道浮点算术的内容"的一些链接.
我还是不明白,一些怎么样0.1或0.5存储在花车和小数.
有人可以解释它是如何布局的记忆?
我知道浮子是两部分(即一个数字的东西).
是否有符合C++标准的方法来确定编译时(或运行时,作为替代)的'float','double'和'long double'的结构?
如果我假设,std::numeric_limits< T >::is_iec559 == true并且std::numeric_limits< T >::radix == 2我怀疑可以通过以下规则:
用下面的表达式模糊地说:
size_t num_significand_bits = std::numeric_limits< T >::digits;size_t num_exponent_bits = log2( 2 * std::numeric_limits< T >::max_exponent );size_t num_sign_bits = 1u;除了我知道
std::numeric_limits< T >::digits 包括"整数位",无论格式是否实际明确表示它,所以我不知道如何以编程方式检测和调整.std::numeric_limits< T >::max_exponent是永远的2^(num_exponent_bits)/2.背景:我试图解决两个问题:
我有一种情况,当Python中的经典表示错误开始成为一个问题:我需要它们用于Numpy中的Matrix操作,并且还不支持十进制类型.
你们都知道,如果我这样做,111.85 * 111.85我会得到,12510.422499999999但如果round(12510.422499999999, 4)我能得到正确的结果,那当然12510.4225.
但实际问题是:
我想知道是否允许 C++ 实现以不同方式表示指向不同类型的指针。例如,如果我们有 4 字节大小/对齐int和 8 字节大小/对齐long,是否可以将指向int/ 的指针表示long为对象地址分别右移 2/3 位?这将有效地禁止将指向指针转换为指向long指针int。
我问是因为[expr.reinterpret.cast/7]:
对象指针可以显式转换为不同类型的对象指针。当
v对象指针类型的纯右值转换为对象指针类型“指向cv 的 指针T”时,结果为static_cast<cv T*>(static_cast<cv void*>(v))。[注7:将指向
T1对象类型的“指向”类型的指针转换为“指向”T1类型的指针T2(其中T2是对象类型,对齐要求T2不比 更严格T1)并返回到其原始类型type 产生原始指针值。—尾注]
第一句暗示我们可以将指针转换为任意两种对象类型。但是,(非规范性)注释 7 中的移情文本表示对齐在这里也起到了一定的作用。(这就是为什么我想出了这个int-long上面的例子。)
这主要是对另一个问题的跟进。OP 想猜测一个变量是否包含一个 int 值,我的第一个想法是在 C 中(如在 C++ 中)一个 int 变量只能包含一个 int 值。Eric Postpischil 提醒我,对于 int 类型,每个标准都允许使用陷阱表示......
当然,我知道大多数现代系统只使用整数的 2 补码表示,没有填充位,这意味着无法观察到陷阱表示。尽管如此,这两个标准似乎仍然允许有符号类型的 3 种表示形式:符号和幅度、一个补码和二进制补码。并且至少 C18 草案(n2310 6.2.6 类型表示)明确允许填充除字符以外的整数类型的位。
因此,在可能的填充位或非二进制补码符号表示的上下文中,int变量可能包含符合实现的陷阱值。有没有可靠的方法来确保 int 变量包含有效值?
c++ integer data-representation language-lawyer bit-representation
这个问题是一个跟进这一个.在Sun的数学库(在C中),表达式
*(1+(int*)&x)
Run Code Online (Sandbox Code Playgroud)
用于检索浮点数的高位字x.这里,OS假定为64位,具有little-endian表示.
我在想如何将上面的C表达式翻译成Python?这里的困难是如何翻译表达式中的'&'和'*'.顺便说一句,也许Python有一些内置函数可以检索浮点数的高位字?
是否可以在具有符合ANSI标准的C编译器的所有环境中使用以下代码?
double n = 0;
assert(n == 0);
Run Code Online (Sandbox Code Playgroud)
那么C++呢?
给定您对某个字符串进行哈希处理以生成256位输出的原因,为什么二进制表示形式的长度不为256
package main
import (
"fmt"
"crypto/sha256"
)
func main() {
s := "1"
m := sha256.Sum256([]byte(s))
fmt.Println(len(m))
b := fmt.Sprintf("%b\n", m[:])
fmt.Println(len(b))
}
Run Code Online (Sandbox Code Playgroud)
输出:
32
267
Run Code Online (Sandbox Code Playgroud)