我将把这个问题归结为最简单的形式:
让我们以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.999999999998和fmod(d,0.25) = 1.
如何解决这个问题?这是一个可编辑的在线示例.
我目前正在用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等等
当我做这个乘法
0.94*8700
输出是
8177.999999999999
但应该是
8178
我正在使用java,但我不认为这个错误与特定的编程语言有关,现在我的问题是......为什么会这样?
什么其他数字(仅作为一个例子)导致相同的错误?
0x1.921fb82c2bd7fp+1人类可读的演示文稿的价值是什么?我通过printf使用得到了这个值%a.
我想了解为什么这段代码:
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)?
我在 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) 我是使用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
在我的代码中,我在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) 我正在使用 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 数据类型仅显示小数点后的单精度。我是否需要应用任何自定义修复。请建议。
提前致谢。
我有一段用Fortran和Matlab编写的代码.他们做了完全相同的计算,即
tanh-field并找到它的拉普拉斯算子该乘法的结果产生矩阵,其中(4,4)和(6,6)I减去.
这个问题非常关键,因为我测试这个数字是否小于零. 问题:有没有办法执行计算,以便在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)