- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在维基百科上看到这个 log 224 = 7.22 .
我不知道为什么我们要计算 2^24 以及为什么我们要取 log10......我真的非常需要你的帮助。
最佳答案
why floating-points number's significant numbers is 7 or 6 (?)
考虑使用 Pigeonhole principle 的一些想法:
float
可以编码大约 232 个不同的数字正好。可以在文本中写入的数字,如 42.0、1.0、3.1415623... >。任何时间代码都有一个文本值,如 0.1f
, 它被编码到附近的 float
,这可能不是完全相同的文本值。问题是:我们可以编码多少位数字并仍然保持独特性 float
?把这个放在一起......
作为文本,范围 [1.000_000 ... 2.000_000),使用 1 个前导数字和 6 个尾随数字,有 1,000,000 个不同的值。根据#3,在相同范围内,有 8,388,608 个不同 float
存在,允许每个文本值映射到不同的 float
. 在此范围内我们可以使用 7 位数字。
作为文本,范围 [9,000,000 × 103 和 10,000,000 × 103),使用 1 个前导数字和 6 个尾随数字,有 1,000,000 个不同的值。根据#4,在相同的范围内,有不到 1,000,000 个不同的 float
值。因此,一些十进制文本值将转换为相同的 float
. 在此范围内,我们可以使用 6 位而不是 7 位数字进行独特的转换。
典型的最坏情况float
是6位有效数字。找到你的的限制 float
:
#include <float.h>
printf("FLT_DIG = %d\n", FLT_DIG); // this commonly prints 6
... no idea why we should calculate 2^24 and why we should take log10
224 是对常见 float
的概括及其 24 位的二进制 精度,对应于奇特的十进制 系统,有 7.22... 位。我们取log10 来比较二进制 float
到十进制文本。
224 == 107.22...
但我们不应该取 224。让我们看看如何FLT_DIG
从 C11dr §5.2.4.2.2 11 定义:
number of decimal digits, q, such that any floating-point number with q decimal digits can be rounded into a floating-point number with p radix b digits and back again without change to the q decimal digits,
p log10 b ............. if b is a power of 10
⎣(p − 1) log10 _b_⎦.. otherwise
注意“log10 224”等同于“24 log10 2”。
作为 float
,这些值在 2 的幂之间线性分布,如#2、3、4 所示。
作为文本,值在 10 的幂之间线性分布,例如 [1.000000 ... 9.999999]*10some_exponent .
这两组的转换发生在不同的值。 1,2,4,8,16,32... 与 1,10,100, ... 在确定最坏情况时,我们从 24 位中减去 1 以解决未对齐问题。
⎣(p − 1) log10 _b_⎦ --> floor((24 − 1) log10(2))
--> floor(6.923...)
--> 6.
有我们的 float
使用基数 10、100 或 1000,而不是非常常见的 2,这两个组的转换发生在相同的值,我们不会减去一个。
关于c - 为什么 float 的有效数字是 7 或 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49961587/
如何在 C++ 中进行涉及有效数字的数学运算?我希望它能正确处理化学和物理实验的测量数据。一个例子:65/5 = 10。我需要去掉不需要的小数位并将一些数字替换为 0。 谢谢! 最佳答案 这应该可以满
这个任务看起来很简单 - 在输入时我得到测试数量 (numOfTests),然后是两个数字 (downBorder, upBorder) 和我必须找出这些数字(downBorder、upBorder)
如果我有 double (234.004223) 等,我想在 C# 中将其四舍五入为 x 位有效数字。 到目前为止,我只能找到舍入到 x 位小数的方法,但是如果数字中有任何 0,这只会删除精度。 例如
我是一名优秀的程序员,十分优秀!