优化我们正在开发的游戏,我们正在进入每个CPU周期都很重要的阶段.我们使用弧度来计算围绕其他对象旋转的对象的位置,我想在查找表中减少不必要的精度.为此,我们大量使用预定义的Pi.这个Pi有多准确?
所以,我的问题是:
我正在编写一段代码,我必须将其从double转换为float值.我正在使用boost :: numeric_cast进行此转换,这将提醒我任何溢出/下溢.但是我也有兴趣知道这种转换是否会导致一些精确损失.
例如
double source = 1988.1012;
float dest = numeric_cast<float>(source);
Run Code Online (Sandbox Code Playgroud)
产生具有价值1988.1的dest
有没有什么方法可以检测到这种精确损失/舍入
c++ floating-point rounding-error rounding floating-accuracy
我注意到,当我存储一个double值,例如x = 0.56657011973046234在sqlite数据库中,然后在以后检索它时,我得到了y = 0.56657011973046201.根据sqlite规范和.NET规范(我最初都不打算阅读:)这是预期和正常的.
我的问题是,虽然高精度并不重要,但我的应用程序处理用户输入/选择代表基本3D信息的双打,然后对它们运行模拟以查找结果.此输入可以保存到sqlite数据库,以便重新加载并在以后重新运行.
之所以出现这种混淆,是因为新创建的一系列输入显然会在存储和重新加载后以相同的输入方式略微模拟(因为双值已经改变).这是合乎逻辑的,但不是理想的.
我还没有谈到如何处理这个问题,但与此同时我想将用户输入限制/钳位到可以精确存储在sqlite数据库中的值.因此,如果用户输入0.56657011973046234,它实际上被转换为0.56657011973046201.
但是,鉴于一个数字,我无法弄清楚数据库中存储了什么值,而不是实际存储和从数据库中检索它,这看起来很笨拙.有没有确定的方法这样做?
可能重复:
与float文件相比较的奇怪输出
当我尝试比较2个相同的float值时,它不会在以下代码中打印"相等的值":
void main()
{
float a = 0.7;
clrscr();
if (a < 0.7)
printf("value : %f",a);
else if (a == 0.7)
printf("equal values");
else
printf("hello");
getch();
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
当我将1.265乘以10000时,使用Javascript时得到126499.99999999999.
为什么会这样?
尝试找到num ^ num的前k个数字的问题我在C++和Python中编写了相同的程序
C++
long double intpart,num,f_digit,k;
cin>>num>>k;
f_digit= pow(10.0,modf(num*log10(num),&intpart)+k-1);
cout<<f_digit;
Run Code Online (Sandbox Code Playgroud)
蟒蛇
(a,b) = modf(num*log10(num))
f_digits = pow(10,b+k-1)
print f_digits
Run Code Online (Sandbox Code Playgroud)
输入
19423474 9
Run Code Online (Sandbox Code Playgroud)
产量
C++ > 163074912
Python > 163074908
Run Code Online (Sandbox Code Playgroud)
我检查了结果C++解决方案是准确的.在http://www.wolframalpha.com/input/?i=19423474^19423474上查看
任何想法如何在Python中获得相同的精度???
编辑:我知道外部库包获得这种精度,但任何NATIVE解决方案???
任何人都可以帮助我为什么x2打印零.我想因为浮点表示X1四舍五入,有没有办法保持进动.
long double x1, x2;
x1= 0.087912088; // Note: 360/4095 = 0.087912088
x2 = 360/4095;
printf("%Lf, %Lf \n",x1, x2);
Run Code Online (Sandbox Code Playgroud)
结果:
x1 =0.087912
x2= 0.000000
Run Code Online (Sandbox Code Playgroud) 我对浮点运算很感兴趣,因为我真的很想理解这个话题!
我知道数字可以用科学记数法表示.
因此,对于这两个数字,指数应如下所示:
非规范化数: 11 .... 11 so(1 + 1/2 + 1/2 ^ 2 + ... + 1/2 ^ 52)*2 ^ 1023
归一化数: 11 .... 11 so(1 + 1/2 + 1/2 ^ 2 + ... + 1/2 ^ 52)*2 ^ 1024
但是,我不确定这是否正确?
我真的很感激你的回答!
floating-point binary denormalization floating-accuracy ieee-754
来自MATLAB的Python新手.
我正在使用幅度尺度函数的双曲正切截断.将0.5 * math.tanh(r/rE-r0) + 0.5函数应用到范围值数组时遇到问题r = np.arange(0.1,100.01,0.01).我0.0在接近零的一侧获得了函数的几个值,这在我执行对数时会导致域问题:
P1 = [ (0.5*m.tanh(x / rE + r0 ) + 0.5) for x in r] # truncation function
Run Code Online (Sandbox Code Playgroud)
我用这个解决方法:
P1 = [ -m.log10(x) if x!=0.0 else np.inf for x in P1 ]
Run Code Online (Sandbox Code Playgroud)
这对我正在做的事情已足够,但它有点像创可贴解决方案.
根据数学显性的要求:
在天文学中,幅度尺度大致如下:
mu = -2.5log(flux) + mzp # apparent magnitude
Run Code Online (Sandbox Code Playgroud)
其中mzp是每秒看到1个光子的幅度.因此,更大的通量等于更小(或更负)的视在幅度.我正在为使用多个组件功能的源制作模型.防爆.具有不同sersic索引的两个sersic函数,P1在内部组件1-P1上具有外部截断,在外部组件上具有内部截断.这样,当将截断函数添加到每个分量时,由半径定义的幅度将变得非常大,因为mu1-2.5*log(P1)在P1渐近逼近零时有多小.
TLDR:我想知道的是,是否存在一种保留浮点的方法,其精度不足以与零区分(特别是在渐近逼近零的函数的结果中).这很重要,因为在获取这些数字的对数时,结果就是域错误.
非对数P1中输出之前的最后一个数字开始读取零5.551115123125783e-17,这是一个常见的浮点算术舍入误差结果,其中所需的结果应为零.
任何投入将不胜感激.
@user:Dan没有放完我的整个脚本:
xc1,yc1 = 103.5150,102.5461;
Ee1 = 23.6781;
re1 = …Run Code Online (Sandbox Code Playgroud) python math rounding-error floating-accuracy hyperbolic-function
我需要提高矿井大气散射GLSL片段着色器之一的功能的精度,该着色器可计算单射线与轴对齐的椭球之间的交点。
这是矿山大气散射着色器的核心功能。旧的原始着色器已启用,floats并且可以正常渲染,但是添加缩放后,我发现距离相对较小时会失去精度。在浮子上,地球的可用距离仅为0.005 AU(天文单位)。因此,我尝试将关键功能移植到该端口上,double并且它有所帮助,因此现在可用距离约为1.0 AU(带有较小的伪像)
这是doubleFragment Shader中函数的版本(旧版本的源代码已弃用!!!)
#extension GL_ARB_gpu_shader_fp64 : enable
double abs(double x) { if (x<0.0) x=-x; return x; }
// compute length of ray(p0,dp) to intersection with ellipsoid((0,0,0),r) -> view_depth_l0,1
// where r.x is elipsoid rx^-2, r.y = ry^-2 and r.z=rz^-2
float view_depth_l0=-1.0,view_depth_l1=-1.0;
bool _view_depth(vec3 _p0,vec3 _dp,vec3 _r)
{
double a,b,c,d,l0,l1;
dvec3 p0,dp,r;
p0=dvec3(_p0);
dp=dvec3(_dp);
r =dvec3(_r );
view_depth_l0=-1.0;
view_depth_l1=-1.0;
a=(dp.x*dp.x*r.x)
+(dp.y*dp.y*r.y)
+(dp.z*dp.z*r.z); a*=2.0;
b=(p0.x*dp.x*r.x)
+(p0.y*dp.y*r.y)
+(p0.z*dp.z*r.z); b*=2.0;
c=(p0.x*p0.x*r.x) …Run Code Online (Sandbox Code Playgroud)