我发现自己今天做了一些操作,我决定稍微刷新我的浮点知识!
事情发展得伟大,直到我看到了这一点:
...有效数的23个小数位出现在存储器格式中,但总精度为24位
我一次又一次地读它,但我仍然无法弄清楚第24位的位置,我注意到了一些关于a的东西,binary point所以我认为它是在mantissa和它之间的中间点exponent.
我不太确定,但我相信他的作者正在谈论这一点:
Binary point?
|
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
^ this
Run Code Online (Sandbox Code Playgroud) 考虑下面两个非常简单的乘法:
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
我想将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)
使用起来相当麻烦.
有没有更好的方法来定义这个双号,如果可能的话,作为常量?
假设对于给定数量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,48],[1,6,
8 …
我最近一直在尝试模拟一些 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)
我的问题是:
这2个有什么区别?
如何生成样本Generator?
我想测试一个数字是正数还是负数,特别是在零的情况下.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)
在常规库中的任何地方都找不到专用函数,我忽略了什么吗?
编辑:(为什么这是相关的)
这不是我目前的计划了,但问这个问题时,我试图超载根据参数值是否是正面或负面的功能.允许用户通过负零就解决了歧义什么意思零值输入.我认为这对其他用例也可能是普遍感兴趣的.
我正在解码一个二进制文件,它有四个字节表示的十进制数字,小端.例如,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) 我想转换一个Matlab脚本与R使用的EPS()函数.此函数返回到下一个最大浮点数的距离.有谁知道如何在R中这样做?R有.Machine $ double.eps但这是一个常量,不能用作eps()之类的函数.谢谢你的帮助.
我有一系列的花车。它是数据帧 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) 最近需要快速求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 模块,我可以期望从中获得复值函数的标准主值(即遵循主分支切割)? 或者,在这一点上,标准本金值的概念是否过于流动,无法预期一致性?
推动 Wikipedia 页面 ( https://en.wikipedia.org/wiki/Inverse_trigonometric_functions ) 部分关于复数值的讨论导致第四象限解决方案。
对于PSU 数学家发表的关于复数反三角函数的文章 ( http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.413.5729&rep=rep1&type=pdf )也是如此。