- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 dtype=float64 的 numpy 数组,当试图将其类型转换为 float 32 时,一些值完全改变了。例如,我有以下数组:
`test_64 = np.array([20110927.00000,20110928.00000,20110929.00000,20110930.00000,20111003.00000,20111004.00000,20111005.00000,20111006.00000,20111007.00000,20111010.00000,20111011.00000,20111012.00000,20111013.00000,20111014.00000,20111017.00000,20111018.00000,20111019.00000,20111020.00000,20111021.00000,20111024.00000 ,20111025.00000,20111026.00000,20111027.00000,20111028.00000,20111031.00000,20111101.00000,20111102.00000,20111103.00000,20111104.00000,20111107.00000,20111108.00000,20111109.00000,20111110.00000,20111111.00000,20111114.00000,20111115.00000,20111116.00000,20111117.00000,20111118.00000,20111121.00000,20111122.00000,20111123.00000,20111125.00000,20111128.00000,20111129.00000 ,20111130.00000,20111201.00000,20111202.00000,20111205.00000,20111206.00000,20111207.00000,20111208.00000,20111209.00000,20111212.00000,20111213.00000,20111214.00000,20111215.00000,20111216.00000,20111219.00000,20111220.00000,20111221.00000,20111222.00000,20111223.00000,20111227.00000,20111228.00000,2 0111229.00000,20111230.00000,20120103.00000,20120104.00000,20120105.00000,20120106.00000,20120109.00000,20120110.00000,20120111.00000,20120112.00000,20120113.00000,20120117.00000,20120118.00000,20120119.00000,20120120.00000,20120123.00000,20120124.00000,20120125.00000,20120126.00000,20120127.00000,20120130.00000,20120131.00000,20120201.00000,20120202.00000,20120203.00000, 20120206.00000,20120207.00000,201208.00000,20120209.00000,20120210210.00000,20120213.00000,20120214.00000,20120215.00000,000,20120216.00000,000,20120217.00000])
>>>>>>>>>>>>test_32 = np.array(test_64, dtype=np.float32)`
这会将 20110927.00000 的值更改为 20110928.00000
甚至尝试:
np.float32(test_64[0])
将导致值从 20110927.00000 更改为 20110928.00000
使用 cupy 数组时发生同样的事情
最佳答案
嗯,是的,这就是 float32。
从最短的角度看,float32 有 24 位有效数(1 位符号,8 位指数)。总共是 33 位。但是第一个有效位没有被存储,因为它被假定为 1。
np.log2(20110927.)
# 24.2614762474699
所以,看到问题了。您将需要 25 位才能对该数字具有单位精度。既然你没有,那么从 float32 的角度来看,20110927 和 20110928 大致相同。
最长的答案,在 FP32 中编码 20110927,然后编码 20110928。
20110927 是 1.1987046599388123 × 2²⁴
所以指数是 24。即FP32格式的24+127=151
然后忘记第一个,这是隐式的(因为选择了指数,例如它以这个 1.
开头),23 个有效数位
s=1.1987046599388123 # Implicit 1
s=s%1*2 # 0.3974... →0
s=s%1*2 # 0.7948... →0
s=s%1*2 # 1.5896... →1
s=s%1*2 # 1.1793... →1
s=s%1*2 # 0.3585... →0
s=s%1*2 # 0.7171... →0
s=s%1*2 # 1.4342... →1
s=s%1*2 # 0.8684... →0
s=s%1*2 # 1.7368... →1
s=s%1*2 # 1.4736... →1
s=s%1*2 # 0.9471... →0
s=s%1*2 # 1.8943... →1
s=s%1*2 # 1.7886... →1
s=s%1*2 # 1.5771... →1
s=s%1*2 # 1.1543... →1
s=s%1*2 # 0.3086... →0
s=s%1*2 # 0.6172... →0
s=s%1*2 # 1.2344... →1
s=s%1*2 # 0.4688... →0
s=s%1*2 # 0.9375... →0
s=s%1*2 # 1.8750... →1
s=s%1*2 # 1.7500... →1
s=s%1*2 # 1.5000... →1
(s%1
是 float 的小数部分。1.51%1
是 0.51
)
我是这样计算的,从 20110927/2²⁴ 开始,因为这是以 2 为底的编码。但实际上,这只是 20110927 24 个最高有效位的二进制编码。
bin(20119827)
# 1001100101101111001001111
请注意,这些是相同的位,但对于最后的 1,因为有 25 位,而我们只需要 24 位。包括隐式的 1。
并且因为下一位是 1,或者因为我的 float 算法的最后 s
是 1.5,所以它被四舍五入到下一位。所以最后,编码的是100110010110111100101000
(为了准确,我对这个四舍五入的东西进行了精确处理,以获得准确的结果。但这不是你的问题的原因。它没有四舍五入,所有会改变的是,而不是 20110927=20110928,你会有 20110927=20110926。但是无论如何,24 位不足以区分两个连续的大于 16777216 的 10 进制数。无论如何,这不是确定的事情。有时,.5 会向下舍入)
忽略第一个,并添加符号 (0) 和指数 (24+127=151 aka 1001011)
20110927.0的float32表示是01001011100110010110111100101000
对 20110928.0 执行相同的操作...您会得到完全相同的结果。
因此,在 float32 中,20110927.0 和 20110928.0(以及 20110927.5,...)是同一回事。
在没有关于如何编码 float32 的理论的情况下检查的另一种方法是
import struct
bin(struct.unpack('i', struct.pack('f', 20110927))[0])
# 0b1001011100110010110111100101000
bin(struct.unpack('i', struct.pack('f', 20110928))[0])
# 0b1001011100110010110111100101000
或者看大局
import struct
for i in range(20110901, 20110931):
print(i, bin(struct.unpack('i', struct.pack('f', i))[0]))
20110901 0b1001011100110010110111100011010
20110902 0b1001011100110010110111100011011
20110903 0b1001011100110010110111100011100
20110904 0b1001011100110010110111100011100
20110905 0b1001011100110010110111100011100
20110906 0b1001011100110010110111100011101
20110907 0b1001011100110010110111100011110
20110908 0b1001011100110010110111100011110
20110909 0b1001011100110010110111100011110
20110910 0b1001011100110010110111100011111
20110911 0b1001011100110010110111100100000
20110912 0b1001011100110010110111100100000
20110913 0b1001011100110010110111100100000
20110914 0b1001011100110010110111100100001
20110915 0b1001011100110010110111100100010
20110916 0b1001011100110010110111100100010
20110917 0b1001011100110010110111100100010
20110918 0b1001011100110010110111100100011
20110919 0b1001011100110010110111100100100
20110920 0b1001011100110010110111100100100
20110921 0b1001011100110010110111100100100
20110922 0b1001011100110010110111100100101
20110923 0b1001011100110010110111100100110
20110924 0b1001011100110010110111100100110
20110925 0b1001011100110010110111100100110
20110926 0b1001011100110010110111100100111
20110927 0b1001011100110010110111100101000
20110928 0b1001011100110010110111100101000
20110929 0b1001011100110010110111100101000
20110930 0b1001011100110010110111100101001
请注意,.5 的一半次数向上舍入,一半次数向下舍入。导致这种 3/1 模式。 20110919=20110920=20110921,20110922是唯一的,20110923=20110924=20110925,20110926是唯一的,20119727=20110928=20110929。 ...
但是,重要的一点是 float32 的可能性较小,在此范围内可能有 8 位以 10 为基数的数字。
关于python - 从 np.float64 转换为 np.float32 完全改变了一些数字的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74495636/
1。 Set 的 parallelStream 没有使用足够的线程。 Java8 parallelStream 不能完全并行工作。在我的计算机中,当任务数小于处理器数时,java8 集的 parall
我想将位置发送到 Google Geocoding API,因此我想用 + 替换文本中的任何空格或逗号(因为可以接收)。 例如,所有这些样本应返回 Glentworth+Ireland: Glentw
所以我需要为将要上传的图像文件生成较小的预览,并且我必须在每个文件名的末尾附加“_preview”。 目前我正在这样做: uploadFile.map((file) => { if (fi
我们可以用参数定义类型同义词,这在与实际类型一起使用时效果很好: type MyType t = t String String data Test a b = Test a b f :: MyTyp
给定一个包含一些 TGraphic 后代的 Delphi TPicture,我需要计算像素颜色和不透明度。我认为我必须为每个类提供不同的实现,并且我认为我已经涵盖了 TPngImage。 32 位位图
我正在调试 Powershell 项目。我正在使用 Import-Module 从我的 C# dll 加载 PS 模块,一切正常。尽管调用 Remove-Module 并不会完全卸载模块,因为 DLL
有没有办法在ElasticSearch中要求完整(尽管不一定精确)匹配? 例如,如果一个字段具有术语"I am a little teapot short and stout",我想匹配" i am
我正在尝试根据日期范围连接两个表。 表A格式为: ID CAT DATE_START DATE_END 1 10 2018-01-01 2020-12-31 2
我最近加入了一家公司,在分析他们的环境时,我注意到 SharePoint web.config 的信任级别设置为“完全”。我知道这绝对是一个糟糕的做法,并且希望 stackoverflow 社区能够帮
我构建了一个完全依赖 AJAX 的 php/js 应用程序,因此没有任何内容是静态的。 我正在尝试找到一种方法来转换基于内容的广告,该广告使用 AJAX 交付的内容作为关键字。 Google 的 Ad
我正在尝试根据日期范围连接两个表。 表A格式为: ID CAT DATE_START DATE_END 1 10 2018-01-01 2020-12-31 2
我熟悉 FileSystemWatcher 类,并使用它进行了测试,或者我使用快速循环进行了测试,并在目录中列出了类型文件的目录列表。在这种特殊情况下,它们是 zip 压缩的 SDF 文件,我需要解压
按照 Disqus 上的教程进行操作时,评论框不会呈现。从 disqus 上找到的管理员看来,它的设置似乎是正确的。 var disqus_config = function () { this
是否可以使用 Cython 将 Python 3 应用程序完全编译/链接为可执行格式(当然假设所有使用的模块都是 cythonable)。 我在 Linux 下工作,我希望获得一个依赖性尽可能小的 E
我有一个 C# 控制台应用程序,而不是运行预构建步骤(以获取 NuGet 包)。 当我调试这个时,我想传入一个参数并显示控制台。当我不调试它时,我不想看到它。我什至不希望它在那里闪烁一秒钟。 我找到了
我在 n 个节点上有一个完整的 19 元树。我标记所有具有以下属性的节点,即它们的所有非根祖先都是最年长或最小的 child (包括根)。我必须为标记节点的数量给出一个渐近界限。 我注意到 第一层有一
我正在阅读一篇关于 Java Volatile 关键字的文章,遇到了一些问题。 click here public class MyClass { private int years;
一本书中写道——“如果问题 A 是 NP-Complete,则存在解决 A 的非确定性多项式时间算法”。但据我所知,"is"——NP 完全问题的答案可以在多项式时间内“验证”。我真的很困惑。能否使用非
考虑以下问题: 有N个硬币,编号为1到N。 你看不到它们,但是给出了关于它们的 M 个事实,形式如下: struct Fact { set positions int num_head
我想制作一个包装数字类型的类型(并提供额外的功能)。 此外,我需要数字和包装器可以隐式转换彼此。 到目前为止我有: template struct Wrapper { T value;
我是一名优秀的程序员,十分优秀!