我正在创建一个numpy随机值数组并将它们添加到包含32位浮点数的现有数组中.我想使用与目标数组相同的dtype生成随机值,这样我就不必手动转换dtypes.目前我这样做:
import numpy as np
x = np.zeros((10, 10), dtype='f')
x += np.random.randn(*x.shape).astype('f')
Run Code Online (Sandbox Code Playgroud)
我想做的而不是最后一行是这样的:
x += np.random.randn(*x.shape, dtype=x.dtype)
Run Code Online (Sandbox Code Playgroud)
但randn(实际上没有一个numpy.random方法)不接受dtype参数.
我的具体问题是,是否可以在创建随机数时为其指定dtype,而无需调用astype?(我的猜测是随机数生成器是64位长,所以这样做真的没有意义,但我想我会问是否可能.)
我正在进行高精度的科学计算.在寻找各种效果的最佳表示时,我不断提出想要获得下一个更高(或更低)双精度数的理由.基本上,我想要做的是在double的内部表示中添加一个最低有效位.
难点在于IEEE格式不完全一致.如果要使用低级代码并实际将一个代码添加到最低有效位,则生成的格式可能不是下一个可用的双精度型.例如,它可能是一个特殊的案例编号,例如PositiveInfinity或NaN.还有一些次正常值,我不认为这些值,但它们似乎具有与"正常"模式不同的特定位模式.
可以使用"epsilon"值,但我从未理解其定义.由于double值不是均匀间隔,因此不能将单个值添加到double以产生下一个更高的值.
我真的不明白为什么IEEE没有指定一个函数来获得下一个更高或更低的值.我不可能是唯一需要它的人.
有没有办法获得下一个值(没有某种类型的循环尝试添加更小和更小的值).
我看到很多关于浮点数的精度数的问题,但具体来说我想知道为什么这个代码
#include <iostream>
#include <stdlib.h>
int main()
{
int a = 5;
int b = 10;
std::cout.precision(4);
std::cout << (float)a/(float)b << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显示0.5?我希望看到0.5000.是因为原始整数数据类型?
我遇到了两种不同的浮点数精度公式.
⌊(N-1)log 10(2)⌋= 6位小数(单精度)
和
N log 10(2)≈7.225十进制数字(单精度)
其中N = 24个有效位(单精度)
第一个公式位于由W. Kahan教授撰写的" IEEE标准754二进制浮点运算 " 第4页的顶部.
第二个公式可以在维基百科文章" 单精度浮点格式 "的IEEE 754单精度二进制浮点格式:binary32下找到.
对于第一个公式,W.Kahan教授说
如果十进制字符串最多为6 sig.(分解). 转换为Single,然后转换回相同数量的sig.dec.,那么最后的字符串应该与原始字符串匹配.
对于第二个公式,维基百科说
...总精度为24位(相当于log 10(2 24)≈7.225十进制数字).
两个公式(6和7.225十进制数字)的结果是不同的,我希望它们是相同的,因为我假设它们都是为了表示最有效的十进制数字,可以转换为浮点二进制,然后转换回来十进制,其开头的有效十进制数字相同.
为什么这两个数字不同,什么是最重要的十进制数字精度可以转换为二进制并返回到十进制而不会失去重要性?
floating-point binary decimal significant-digits floating-point-precision
在Ruby 2.2.0中,为什么:
BigDecimal.new(34.13985572755337, 9)
Run Code Online (Sandbox Code Playgroud)
平等34.0但是
BigDecimal.new(34.13985572755338, 9)
Run Code Online (Sandbox Code Playgroud)
平等34.1398557?
请注意,我在64位计算机上运行它.
ruby floating-point rounding bigdecimal floating-point-precision
我试图编写一个近似平方根的函数(我知道有数学模块......我想自己做),我被浮点运算搞砸了.你怎么能避免这种情况?
def sqrt(num):
root = 0.0
while root * root < num:
root += 0.01
return root
Run Code Online (Sandbox Code Playgroud)
使用它有以下结果:
>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998
Run Code Online (Sandbox Code Playgroud)
我意识到我可以使用round(),但我希望能够让它真正准确.我希望能够计算出6或7位数.如果我四舍五入,这是不可能的.我想了解如何在Python中正确处理浮点计算.
我知道基本数据类型,浮点类型(float,double)不能完全保存一些数字.
在将一些代码从Matlab移植到Python(Numpy)时,我发现计算中存在一些显着的差异,我认为它会回到精确度.
采用以下代码,对仅具有非零值的前两个元素进行z标准化500维向量.
Matlab的:
Z = repmat(0,500,1); Z(1)=3;Z(2)=1;
Za = (Z-repmat(mean(Z),500,1)) ./ repmat(std(Z),500,1);
Za(1)
>>> 21.1694
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
from numpy import zeros,mean,std
Z = zeros((500,))
Z[0] = 3
Z[1] = 1
Za = (Z - mean(Z)) / std(Z)
print Za[0]
>>> 21.1905669677
Run Code Online (Sandbox Code Playgroud)
除了格式化在Python中显示更多位数之外,还有一个巨大的差异(imho),大于0.02
Python和Matlab都使用64位数据类型(afaik).Python使用'numpy.float64'和Matlab'double'.
为什么差异如此之大?哪一个更正确?
我经常需要地板或CEIL一CGFloat到int,对于数组索引的计算.
我看到永久的问题floorf(theCGFloat)或者ceilf(theCGFloat)是有可与浮点不准确的麻烦.
那么,如果我CGFloat的2.0f内部被表示为1.999999999999f或类似的东西,那该怎么办呢?我floorf并获得1.0f,这是再次浮动.然而,我必须把这个野兽施放到int,这可能会引入另一个问题.
是否有一个最佳实践如何楼或小区一float到int这样的东西像2.0永远不会意外遭到地板到1让人觉得2.0永远不会意外遭到ceiled来2?
math floating-point floating-accuracy ios floating-point-precision
有没有办法得到一个显示a的确切值的字符串double,所有小数位都需要表示它在10的基本精确值?
例如(通过Jon Skeet和Tony the Pony),当你输入时
double d = 0.3;
Run Code Online (Sandbox Code Playgroud)
实际值d是完全正确的
0.299999999999999988897769753748434595763683319091796875
Run Code Online (Sandbox Code Playgroud)
每个二进制浮点值(忽略诸如无穷大和NaN之类的东西)将解析为终止十进制值.因此,在输出中有足够的精度数字(在这种情况下为55),您可以随时获取a中的任何内容double并以十进制显示其精确值.当需要解释浮点运算的奇怪性时,能够向人们展示确切的值是非常有用的.但有没有办法在C#中做到这一点?
我已经尝试了所有标准数字格式字符串,无论是否指定了精度,并且没有给出确切的值.一些亮点:
d.ToString("n55")输出0.3后跟54个零 - 它通常会"轮到您可能想要看到的内容",然后在最后添加更多的零.如果我使用自定义格式字符串,也是一样的0.00000...d.ToString("r")给你一个足够精确的值,如果你解析它,你会得到你开始时相同的位模式 - 但在这种情况下它只是输出0.3.(如果我处理的是计算结果,而不是常量,这会更有用.)d.ToString("e55")输出2.9999999999999999000000000000000000000000000000000000000e-001- 一些精度,但不是所有它像我正在寻找.是否有一些我错过的格式字符串,或其他一些库函数,或NuGet包或其他库,能够将a转换为double具有完全精度的字符串?
在进行稍微大的重构更改而不修改任何类型的算术时,我设法以某种方式更改了我的程序的输出(基于代理的模拟系统).输出中的各种数字现在都是微不足道的数量.检查表明这些数字在最低有效位中偏离了1位.
例如,24.198110084326416将变为24.19811008432642.每个数字的浮点表示为:
24.198110084326416 = 0 10000000011 1000001100101011011101010111101011010011000010010100
24.19811008432642 = 0 10000000011 1000001100101011011101010111101011010011000010010101
Run Code Online (Sandbox Code Playgroud)
其中我们注意到最低有效位是不同的.
我的问题是,当我没有修改任何类型的算术时,我是如何引入这种变化的?该更改涉及通过删除继承来简化对象(其超类因使用不适用于此类的方法而膨胀).
我注意到输出(在模拟的每个刻度处显示某些变量的值)有时会关闭,然后对于另一个滴答,数字是预期的,只有在下一个滴答时再次关闭(例如,在一个代理上) ,它的值在刻度57-83上表现出这个问题,但是对于刻度84和85是预期的,只有在刻度线86处再次关闭).
我知道我们不应该直接比较浮点数.当仅将输出文件与预期输出进行比较的集成测试失败时,会注意到这些错误.我可以(也许应该)修复测试来解析文件并将解析后的双打与一些epsilon进行比较,但我仍然很好奇为什么可能引入这个问题.
编辑:
引入问题的最小变化差异:
diff --git a/src/main/java/modelClasses/GridSquare.java b/src/main/java/modelClasses/GridSquare.java
index 4c10760..80276bd 100644
--- a/src/main/java/modelClasses/GridSquare.java
+++ b/src/main/java/modelClasses/GridSquare.java
@@ -63,7 +63,7 @@ public class GridSquare extends VariableLevel
public void addHousehold(Household hh)
{
assert household == null;
- subAgents.add(hh);
+ neighborhood.getHouseholdList().add(hh);
household = hh;
}
@@ -73,7 +73,7 @@ public class GridSquare extends VariableLevel
public void removeHousehold()
{
assert household != null;
- subAgents.remove(household);
+ neighborhood.getHouseholdList().remove(household);
household …Run Code Online (Sandbox Code Playgroud)