小编Mar*_*son的帖子

单个精度浮点上的第24个小数位在哪里?IEEE 754

我发现自己今天做了一些操作,我决定稍微刷新我的浮点知识!

事情发展得伟大,直到我看到了这一点:

...有效数的23个小数位出现在存储器格式中,但总精度为24位

我一次又一次地读它,但我仍然无法弄清楚第24位的位置,我注意到了一些关于a的东西,binary point所以我认为它是在mantissa和它之间的中间点exponent.

我不太确定,但我相信他的作者正在谈论这一点:

         Binary point?
             |
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
           ^ this
Run Code Online (Sandbox Code Playgroud)

c c++ ieee-754

7
推荐指数
2
解决办法
803
查看次数

浮点算术运算的精度是多少?

考虑下面两个非常简单的乘法:

double result1;
long double result2;
float var1=3.1;
float var2=6.789;
double var3=87.45;
double var4=234.987;

result1=var1*var2;
result2=var3*var4;
Run Code Online (Sandbox Code Playgroud)

默认情况下,乘法是否以高于操作数的精度完成?我的意思是,在第一次乘法的情况下,它是以双精度完成的,如果在x86架构中第二次,它是以80位扩展精度完成的,或者我们应该在表达式中将操作数转换为更高的精度,如下所示?

result1=(double)var1*(double)var2;
result2=(long double)var3*(long double)var4;
Run Code Online (Sandbox Code Playgroud)

其他操作(添加,除法和余数)怎么样?例如,当添加两个以上的正单精度值时,如果用于保存表达式的中间结果,则使用双精度的额外有效位可以减少舍入误差.

c++ floating-point arithmetic-expressions rounding floating-point-precision

7
推荐指数
2
解决办法
1124
查看次数

将double常量定义为十六进制?

我想将1.0以下最接近的数字作为浮点数.通过阅读维基百科上的文章IEEE-754我已经设法找出1.0二进制表示3FF0000000000000,所以最接近的双值实际上是0x3FEFFFFFFFFFFFFF.

我知道使用这个二进制数据初始化double的唯一方法是:

double a;
*((unsigned*)(&a) + 1) = 0x3FEFFFFF;
*((unsigned*)(&a) + 0) = 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

使用起来相当麻烦.

有没有更好的方法来定义这个双号,如果可能的话,作为常量?

c++ floating-point floating-accuracy notation ieee-754

6
推荐指数
1
解决办法
2733
查看次数

如何建立一个N*(N + 1)矩阵,其数量范围为1~N*N并且是完全分布的?

假设对于给定数量N,生成具有N + 1行的矩阵,并且每行具有N列,每列在范围[1,N ^ 2]中具有N个数.矩阵具有此功能:每列都有N个数字,数字完全分布在另一行.

对不起,英语不是我的母语,我尽力清楚地描述问题,如果你有更好的描述这个问题,请教我如何.

例如N = 3,我可以构建一个矩阵,它有4行3列,数字为[1,3 ^ 2].矩阵是:

[1, 2, 3], [4, 5, 6], [7, 8, 9]
[1, 4, 7], [2, 5, 8], [3, 6, 9]
[1, 5, 9], [2, 6, 7], [3, 4, 8]
[1, 6, 8], [2, 4, 9], [3, 5, 7]
Run Code Online (Sandbox Code Playgroud)

在此示例中,每行有3列,每列有3个数字,3个数字分布在每隔一行的3个不同列中.以下是使用第2行第2列([2,5,8])作为例子.三个数字[2,5,8]在其他行的不同列中.没有其他任何列具有[2,5],[5,8][2,8],但其他行中的每列都只有一个列.

[1,2,3],[4,5,6],[7,8,9]

[1,4,7],[ 2,5,8],[3,6,9]

[ 51,9],[ 2,6,7],[3,4 8],

[1,6,8 …

python algorithm math matrix combinatorics

6
推荐指数
1
解决办法
156
查看次数

numpy.random 与 numpy.random.Generate 之间有什么区别

我最近一直在尝试模拟一些 Monte Carlos 模拟并遇到了numpy.random. 检查指数生成器的文档我注意到这是页面中的警告,它告诉

Generator.exponential 应该用于新代码。

虽然如此,numpy.random.exponential仍然有效,但我无法运行Generator对应程序。我一直收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-c4cc7e61aa98> in <module>
----> 1 np.random.Generator.exponential(2, 1000)

TypeError: descriptor 'exponential' for 'numpy.random._generator.Generator' objects doesn't apply to a 'int' object

Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这2个有什么区别?

  2. 如何生成样本Generator

python random numpy generator montecarlo

6
推荐指数
1
解决办法
578
查看次数

如何在Python中测试负零?

我想测试一个数字是正数还是负数,特别是在零的情况下.IEEE-754允许-0.0,并在Python中实现.

我能找到的唯一解决方法是:

def test_sign(x):
    return math.copysign(1, x) > 0
Run Code Online (Sandbox Code Playgroud)

也许(可能需要更长时间才能运行):

def test_sign(x):
    math.atan2(x, -1)
Run Code Online (Sandbox Code Playgroud)

在常规库中的任何地方都找不到专用函数,我忽略了什么吗?

编辑:(为什么这是相关的)

这不是我目前的计划了,但问这个问题时,我试图超载根据参数值是否是正面或负面的功能.允许用户通过负零就解决了歧义什么意思零值输入.我认为这对其他用例也可能是普遍感兴趣的.

python ieee-754

5
推荐指数
1
解决办法
734
查看次数

如何将4字节IEEE(小端)浮点二进制表示转换为浮点数

我正在解码一个二进制文件,它有四个字节表示的十进制数字,小端.例如,94 53 F0 40代表7.510202.不幸的是,Python给了我7.51020240784.

当我尝试解析这些数据时unpack("<f",sampledata)[0],由于Python存储值的方式,我没有得到原始数据的精确表示(有关更多信息,请参阅http://bugs.python.org/issue4114).

不幸的是,我确实需要获得完全相同的表示 - 无论有关浮点数的不准确性的讨论,因为我需要将这些值写入文本文件,其初始值与最初写入二进制文件的位数相同.

如果可能的话,我宁愿坚持使用Python,但如果有必要,我很乐意在C中实现解决方案.我不能简单地截断unpack函数返回的原因是我不能保证原始float有多少小数位,例如0C 02 0F 41根据我的十六进制编辑器代表8.938,原始二进制文件只有3个小数位.

为了清楚起见,我需要将四个十六进制字节作为输入,并输出文本/ ASCII或IEEE 32位浮点数的数字表示,其具有与创建者所预期的相同的小数位数.文件.输出我将用于创建原始二进制数据文件的CSV,而不是用于实际执行任何计算.

有什么建议?

例:

from __future__ import print_function
from struct import *

print("Should print 7.510202")

hexbytes = b"\x94\x53\xF0\x40"

# 01101001 11001000 11110001 01000000
# should print 7.510202

print(unpack("<f",hexbytes)[0])
Run Code Online (Sandbox Code Playgroud)

c python floating-point binary ieee-754

5
推荐指数
1
解决办法
7198
查看次数

获取R中下一个最大浮点数的距离

我想转换一个Matlab脚本与R使用的EPS()函数.此函数返回到下一个最大浮点数的距离.有谁知道如何在R中这样做?R有.Machine $ double.eps但这是一个常量,不能用作eps()之类的函数.谢谢你的帮助.

floating-point matlab r

5
推荐指数
0
解决办法
105
查看次数

对系列进行舍入时出现错误

我有一系列的花车。它是数据帧 sum() 操作的结果。我需要将其所有元素舍入为整数,但出现错误:

[in]:
A= mins.sum().iloc[1:]/60 
# this line works fine. The .iloc is to get rid of a text column.

[in]:
print(A)

[out]:
Min bad                     249.5
Min pr-ul                   967.57
intra com diff              178.05
Intra com diff 60           184.27
dtype: object
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试四舍五入,则会收到错误:

[in]:
A.round()

[out]:
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-528-685b5302b717> in <module>()
  3 
  4 print(A)
  ----> 5 A.round()

 //anaconda/lib/python3.5/site-packages/pandas/core/series.py in round(self,decimals, *args, **kwargs)
   1303         """
   1304         nv.validate_round(args, kwargs)
   -> 1305         result = _values_from_object(self).round(decimals)
   1306         result = self._constructor(result, …
Run Code Online (Sandbox Code Playgroud)

python rounding pandas

5
推荐指数
1
解决办法
9612
查看次数

cmath 和 numpy 都给出了 asin(10) 的“不正确”值

最近需要快速求10的反正弦,决定用python来帮我计算:

cmath.asin(10)
Run Code Online (Sandbox Code Playgroud)

根据经验,我预计结果会出现在第四象限(正实数(pi/2)和负虚数)。惊喜......它返回了第一象限结果。我也试过 numpy.arcsin ......同样的结果。虽然返回值的正弦值确实是 10,但我认为这不是反正弦函数的标准主值

>>> import math
>>> import numpy as np
>>> z=cmath.asin(10)
>>> z
(1.5707963267948966+2.993222846126381j)
>>> cmath.sin(z)
(9.999999999999998+6.092540900222251e-16j)
>>> z2=np.arcsin(10+0j)
>>> np.sin(z2)
(10+6.092540900222253e-16j)
Run Code Online (Sandbox Code Playgroud)

我使用 numpy 发现了同样的结果(如上所示)。

是否有一个 python 模块,我可以期望从中获得复值函数的标准主值(即遵循主分支切割)? 或者,在这一点上,标准本金值的概念是否过于流动,无法预期一致性?


python math numpy

5
推荐指数
1
解决办法
265
查看次数