标签: double-precision

如何使用fmod并避免精度问题

我将把这个问题归结为最简单的形式:

让我们以0.05的步长从[0 .. 5.0]迭代,并为每0.25乘法器打印出'X'.

for(double d=0.0; d<=5.0; d+=0.05) {
  if(fmod(d,0.25) is equal 0)
    print 'X';
}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为d[0,0.0500000000001,0.100000000002,...]导致fmod()失败.极端的例子是什么时候d=1.999999999998fmod(d,0.25) = 1.

如何解决这个问题?这是一个可编辑的在线示例.

c precision double-precision modulus

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

Java双打不擅长数学

我目前正在用java编写计算器程序.这是我的第一个java程序,我习惯于c ++.

我注意到java中的双打完全不像c ++中的双打.在java和c ++
4.1*3
中尝试这个/ .1

它应该是
12.3然后123,并且c ++给出了这个结果但java给出了
12.299999999999999和122.99999999999999

我怎么能像在c ++中使用双打一样进行数学运算,我知道你在程序中使用12.299999999999999的任何东西都不会与12.3相比没有区别,但是当用户正在阅读数字时,这非常难看.我已经查看了BigDecimal类,但我无法对该类执行trig和logarithms等等

c++ java math calculator double-precision

0
推荐指数
3
解决办法
4605
查看次数

表示中的浮点错误?

当我做这个乘法

0.94*8700

输出是

8177.999999999999

但应该是

8178

我正在使用java,但我不认为这个错误与特定的编程语言有关,现在我的问题是......为什么会这样?
什么其他数字(仅作为一个例子)导致相同的错误?

floating-point floating-accuracy double-precision

0
推荐指数
1
解决办法
316
查看次数

如何翻译printf给出的%a的值?

0x1.921fb82c2bd7fp+1人类可读的演示文稿的价值是什么?我通过printf使用得到了这个值%a.

c floating-point printf double-precision

0
推荐指数
1
解决办法
137
查看次数

了解C中的双精度运算

我想了解为什么这段代码:

double r,d,rc;
scanf("%lf %lf", &r, &d);
rc = (r * r) - (d/2) * (d/2);
printf("%.2f\n", M_PI * rc);
Run Code Online (Sandbox Code Playgroud)

返回比这个更精确的结果(没有rc变量赋值):

double r,d,rc;
scanf("%lf %lf", &r, &d);
printf("%.2f\n", M_PI * (r * r) - (d/2) * (d/2));
Run Code Online (Sandbox Code Playgroud)

另一个相关的问题:为什么n * n比这更好pow(n,2)

c precision types double-precision

0
推荐指数
1
解决办法
137
查看次数

Fortran 中数据类型不匹配

我在 Fortran 95 中编写了一个基本算法,使用通过称为理查森外推法的过程增强的中心差来计算函数的梯度(代码中规定了一个示例)。

function f(n,x)
! The scalar multivariable function to be differentiated

integer :: n
real(kind = kind(1d0)) :: x(n), f

f = x(1)**5.d0 + cos(x(2)) + log(x(3)) - sqrt(x(4))

end function f
!=====!
!=====!
!=====!

program gradient
!==============================================================================!
! Calculates the gradient of the scalar function f at x=0using a finite        !
! difference approximation, with a low order Richardson extrapolation.         !
!==============================================================================!

parameter (n = 4, M = 25)
real(kind = kind(1d0)) :: x(n), xhup(n), xhdown(n), …
Run Code Online (Sandbox Code Playgroud)

floating-point gradient double-precision fortran95

0
推荐指数
1
解决办法
2424
查看次数

将通用块转换为模块

我是使用Fortran编写的程序的研究员。我具有非常基本的编码技能,因此需要一些帮助来使一些代码正确编译。

在显示代码之前,我将提供一些背景知识。我正在处理大量数据,这将需要64位编译和大于2 gb的内存。我在代码中注意到的第一件事是,许多变量被写为“实数”,但是在我的研究中,我发现“双精度”允许更大的变量,并且将是一个更灵活的选择,因此我更改了所有从“真实”变量到“双精度”变量。

fortran构建文件“ dist.f”的编译中还包含一个文件,称为“ geocoord.inc”。我发现变量已保存到一个公共块中,但是再一次,我需要一些可以容纳大量数据的东西。正如我一直相信的那样,模块将是一个更好的程序。在转换此包含文件以使其与模块程序正常工作时,我需要一些建议,我将在下面列出。

Dist.f:

c Convert latitude and longitude to kilometers relative
c to center of coordinates by short distance conversion.

subroutine dist(xlat, xlon, xkm, ykm)

implicit none

c   Parameters:
double precision    xlat, xlon  ! (input)
double precision        xkm, ykm    ! (output)

c   Local variables:
double precision lat1, lat2, lat3
double precision    q
double precision    xx
double precision    yp

include "geocoord.inc"

c Set up short distance conversion by subr. SETORG
  q=60*xlat-olat
  yp=q+olat
  lat1=datan(rlatc*dtan(RAD*yp/60.0))
  lat2=datan(rlatc*dtan(RAD*OLAT/60.0))
  LAT3=(LAT2+LAT1)/2.
  xx=60*xlon-olon  ! …
Run Code Online (Sandbox Code Playgroud)

fortran module double-precision fortran90 fortran-common-block

0
推荐指数
1
解决办法
653
查看次数

奇怪的乘法结果

在我的代码中,我在C++代码中进行了这种乘法,所有变量类型都是double []

f1[0] = (f1_rot[0] * xu[0]) + (f1_rot[1] * yu[0]); 
f1[1] = (f1_rot[0] * xu[1]) + (f1_rot[1] * yu[1]); 
f1[2] = (f1_rot[0] * xu[2]) + (f1_rot[1] * yu[2]); 

f2[0] = (f2_rot[0] * xu[0]) + (f2_rot[1] * yu[0]); 
f2[1] = (f2_rot[0] * xu[1]) + (f2_rot[1] * yu[1]);
f2[2] = (f2_rot[0] * xu[2]) + (f2_rot[1] * yu[2]);
Run Code Online (Sandbox Code Playgroud)

对应于这些值

Force Rot1 : -5.39155e-07, -3.66312e-07
Force Rot2 : 4.04383e-07, -1.51852e-08

xu: 0.786857, 0.561981, 0.255018
yu: 0.534605, -0.82715, 0.173264

F1: -6.2007e-07, -4.61782e-16, -2.00963e-07
F2: …
Run Code Online (Sandbox Code Playgroud)

c++ multiplication double-precision openmpi

0
推荐指数
1
解决办法
1511
查看次数

Hive 数据类型:双精度和小数位数

我正在使用 CDH 5.3.0 和 Hive 0.12。我有一个 Hive 表,其中的列定义为双精度。

我正在将数据从 HDFS 序列文件加载到这些双列,小数点后精度为 2。例如,在我的 HDFS 序列文件中,我的数据类似于 - 100.23 或 345.00。我需要选择 double 因为我的数据值可以是一个很大的值,比如“3457894545.00”

我的要求是在查询 Hive 表时在小数点后显示两个刻度精度。因此,对于上面提到的示例数据,如果我查询此列,则需要将值视为“100.23”或“345.00”。

但是对于 Hive 0.12,我只能得到小数点后的单精度,即值被截断为“100.2”或“345.0”。

我尝试使用“decimal”数据类型给出的语法为“decimal(3,2)”,但在这种情况下,我的值​​完全四舍五入,即“100”或“345”。

我一直在寻找是否有任何选项可以将自定义精度定义为 double 数据类型,并发现可以从 hive 0.13 on wards 给出自定义精度。

Is Hive 0.12 double 数据类型仅显示小数点后的单精度。我是否需要应用任何自定义修复。请建议。

提前致谢。

double hadoop hive double-precision

0
推荐指数
1
解决办法
1万
查看次数

如何在MatLAB中获取Fortran精度

我有一段用Fortran和Matlab编写的代码.他们做了完全相同的计算,即

  1. 构造一个tanh-field并找到它的拉普拉斯算子
  2. 将一些术语相乘

该乘法的结果产生矩阵,其中(4,4)和(6,6)I减去.

  • 在Fortran他们的差异是~1e-20
  • 在Matlab中,它们的差异完全相同.

这个问题非常关键,因为我测试这个数字是否小于零. 问题:有没有办法执行计算,以便在Matlab中获得与Fortran相同的精度?

我列出以下代码:


MATLAB

clear all

weights = [4./9, 1./9,1./9,1./9,1./9, 1./36,1./36,1./36,1./36];
dir_x   = [  0,   1,  0, -1,  0,    1,  -1,  -1,   1];
dir_y   = [  0,   0,  1,  0, -1,    1,   1,  -1,  -1];



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CONSTANTS
length_y = 11; length_x = length_y;
y_center = 5; x_center  = y_center;


densityHigh = 1.0;
densityLow  = 0.1;
radius  = 3.0;
c_width = 1.0;

average_density = 0.5*(densityHigh+densityLow);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%





for x=1:length_x
    for y=1:length_y
        for …
Run Code Online (Sandbox Code Playgroud)

matlab fortran double-precision

0
推荐指数
1
解决办法
191
查看次数