小编Mar*_*son的帖子

如何在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
查看次数

Java双除正性

为什么这段java代码会产生正无穷大?

    double d = 10.0 / -0; 

    System.out.println(d);
    if (d == Double.POSITIVE_INFINITY) 
        System.out.println("Positive Infinity");
    else 
        System.out.println("Negative Infinity");
Run Code Online (Sandbox Code Playgroud)

java floating-point integer point division

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

Python(奇怪的是)舍入值

这个问题更多的是好奇心.

我正在创建以下数组:

A = zeros((2,2))
for i in range(2):
    A[i,i] = 0.6
    A[(i+1)%2,i] = 0.4
print A

>>>
   [[ 0.6  0.4]
   [ 0.4  0.6]]
Run Code Online (Sandbox Code Playgroud)

然后,打印它:

for i,c in enumerate(A):
    for j,d in enumerate(c):
        print j, d
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除j,我得到:

>>>
0 0.6
1 0.4
0 0.4
1 0.6
Run Code Online (Sandbox Code Playgroud)

但如果我从for中删除j,我得到:

(0, 0.59999999999999998)
(1, 0.40000000000000002)
(0, 0.40000000000000002)
(1, 0.59999999999999998)
Run Code Online (Sandbox Code Playgroud)

这是因为我用0.6创建矩阵的方式?它如何代表内部真实价值?

python floating-point numpy

4
推荐指数
1
解决办法
4159
查看次数

在Coq中声明隐式参数:需要多少个下划线?

在下面的Coq代码片段中(从一个真实的例子中删除),我试图将第一个参数声明exponent_valid为隐式:

Require Import ZArith.
Open Scope Z.

Record float_format : Set := mk_float_format {
  minimum_exponent : Z
}.

Record float (fmt : float_format) : Set := mk_float {
  exponent : Z;
  exponent_valid : minimum_exponent fmt <= exponent
}.

Arguments exponent_valid {fmt} _.
Run Code Online (Sandbox Code Playgroud)

据我所知,该exponent_valid函数有两个参数:一个是类型float_format,一个是类型float,第一个可以推断出来.但是,编译上面的代码段失败,并显示以下错误消息:

File "/Users/mdickinson/Desktop/Coq/floats/bug.v", line 13, characters 0-33:
Error: The following arguments are not declared: _.
Run Code Online (Sandbox Code Playgroud)

事实上,将Arguments声明更改为:

Arguments exponent_valid {fmt} _ _.
Run Code Online (Sandbox Code Playgroud)

使错误消息消失.

没关系; 我是Coq的新手,我完全相信我忽略了一些东西.但是现在我真的很困惑我:如果我用a 替换<= …

coq

4
推荐指数
1
解决办法
630
查看次数

如何循环浮动0.5到1.0,同时仍然四舍五入到0.45到0.0,正如通常的学校四舍五入?

出现默认Python round(1 / 2)给出0.

如何循环浮动0.5到1.0,同时仍然四舍五入到0.45到0.0,正如通常的学校四舍五入?

注意:很抱歉删除并再次发布此内容,但它被错误地标记为另一个问题的副本.

python floating-point rounding python-3.x

4
推荐指数
2
解决办法
5987
查看次数

是否有公式可以找到浮点数中指数或有效位数的位数?

最近,我对在浮点数上使用位移位进行一些快速计算很感兴趣。

为了让它们以更通用的方式工作,我想让我的函数使用不同的浮点类型,可能是通过模板,不仅限于floatand double,还有“半宽”或“四倍宽”浮点数等等.


然后我注意到:

 - Half   ---  5 exponent bits  ---  10 signicant bits
 - Float  ---  8 exponent bits  ---  23 signicant bits
 - Double --- 11 exponent bits  ---  52 signicant bits
Run Code Online (Sandbox Code Playgroud)

到目前为止,我认为exponent bits = logbase2(total byte) * 3 + 2
这意味着 128 位浮点数应该有 14 个指数位,而 256 位浮点数应该有 17 个指数位。


然而,后来我了解到:

 - Quad   --- 15 exponent bits  ---  112 signicant bits
 - Octuple--- 19 exponent bits  ---  237 signicant bits
Run Code Online (Sandbox Code Playgroud)

那么,有没有一个公式可以找到它?或者,有没有办法通过一些内置函数来调用它?
C 或 …

c c++ floating-point bit-manipulation

4
推荐指数
1
解决办法
278
查看次数

试图将二进制补码16位读入带符号的十进制数

我尝试(在PHP中)读取两个字节(16位)的二进制补码值并返回一个带符号的十进制数.

我不确定这两个恭维数学应该如何工作,但是从php.net,我设法得到它几乎显示我的期望.我认为我遇到的问题是我没有得到任何负面价值.

我有以下代码:

function _bin16dec($bin) {
    // Function to convert 16bit binary numbers to integers using two's complement
    $num = bindec($bin);
    if($num > 0xFFFF) { return false; }
    if($num >= 0x8000) {
        return -(($num ^ 0xFFFF)+1);
    } else {
        return $num;
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码是有人在网上提出的,但它在python中不明白.

def twoscomp( x ) :
   "This returns a 16-bit signed number (two's complement)"
   if (0x8000 & x): 
   x = - (0x010000 - x)
return x
Run Code Online (Sandbox Code Playgroud)

应用程序从陀螺仪中为2的补码形式中的每个轴读取两个字节.

提前致谢!

山姆

php python math binary

3
推荐指数
1
解决办法
3228
查看次数

从二进制文件解包双值

我知道在 Python 中读取 C double 值存在问题。在我的程序中,我从二进制文件中读取并将数值转换为各种大小的整数,没有问题。我使用下面的代码来读取双精度值。

peakDescriptor["area"] = struct.unpack("d",file.read(8))
Run Code Online (Sandbox Code Playgroud)

价值观应该是什么和我得到什么之间存在巨大差异。下面的第一个表是我所得到的:
甲烷3.6368230562528605e-307
乙烷-8.243249632731949e + 306
丙烷1.839329701286865e-60
2-甲基-2.55127317345224e-306
丁烷3.737451552798833e + 59
...

该表显示,这些值应该是:
甲烷 97.25
乙烷 426.50
丙烷 2755.60
2-甲基丙烷 3390.25
丁烷 10906.60
...

如何正确读取这些数字?

我的代码可以在这里找到

原始文件和结果文件在这里这里

如果您在访问文件时遇到问题,请告诉我!

PS我已经尝试根据结构文档更改格式字符串以包含“>”符号 - 这仍然会导致意外值以及一些NaN!

python floating-point binary struct python-3.x

3
推荐指数
1
解决办法
1851
查看次数

当Python 3中的尾随小数点> = 0.5时,math.ceil()和round()之间的算法区别是什么?

当Python 3中的尾随小数点> = 0.5时,math.ceil()和round()之间的算法区别是什么?

例如,

round(9.5) = 10
round(9.67) = 10
math.ceil(9.5) = 10
math.ceil(9.5) = 10
Run Code Online (Sandbox Code Playgroud)

python algorithm math python-3.x

3
推荐指数
1
解决办法
106
查看次数

Python3:计算两个列表总和为100的所有排列的最有效方法是什么?

想象一下,我们有一个股票清单:

stocks = ['AAPL','GOOGL','IBM']
Run Code Online (Sandbox Code Playgroud)

具体的股票并不重要,重要的是我们在这个清单中有n个项目.

想象一下,我们还有一个权重列表,从0%到100%:

weights = list(range(101))
Run Code Online (Sandbox Code Playgroud)

给定n = 3(或任何其他数字),我需要生成一个矩阵,其中每个可能的权重组合总和达到100%.例如

0%, 0%, 100%
1%, 0%, 99%
0%, 1%, 99%
etc...
Run Code Online (Sandbox Code Playgroud)

是否有一些itertools的方法可以做到这一点?什么东西在numpy?最有效的方法是什么?

python numpy combinatorics python-itertools

3
推荐指数
1
解决办法
144
查看次数