在过去的几周中,我的代码中出现了一个令人沮丧的错误。我的代码可以完全按照我的计算机上的预期运行,但是一旦将其移植到HPC服务器上,它就会产生奇怪的结果。
我将其归结为:在我的计算机(iMac)上,该函数abs()使用浮点数,但在服务器上将其abs()截断为整数。
例:
服务器
abs(-1.1341234) = 1
Run Code Online (Sandbox Code Playgroud)
我的Mac
abs(-1.1341234) = 1.1341234
Run Code Online (Sandbox Code Playgroud)
现在我知道我可以使用解决此fabs()问题,这不是问题。我看了gcc两台机器上的版本,这是输出:
服务器
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/software/GCCcore/5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --enable-languages=c,c++,fortran --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-gold=default --enable-plugins --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/software/GCCcore/5.4.0 --with-local-prefix=/apps/software/GCCcore/5.4.0 --enable-bootstrap --with-isl=/dev/shm/GCCcore/5.4.0/dummy-/gcc-5.4.0/stage2_stuff
Thread model: posix
gcc version 5.4.0 (GCC)
Run Code Online (Sandbox Code Playgroud)
我的Mac
g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么abs()在gcc和clang之间会产生不同的结果?从字面上看,这个问题使我花了3个星期的时间,所以可以想像我刚才有点咸...
如何计算光线与平面之间的交点?我一直在访问我能找到的每个可能的网站,这是我迄今为止取得的成就:
float denom = normal.dot(ray.direction);
if (denom > 0)
{
float t = -((center - ray.origin).dot(normal)) / denom;
if (t >= 0)
{
rec.tHit = t;
rec.anyHit = true;
computeSurfaceHitFields(ray, rec);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:s
我的函数输入是:
ray:包含原点和方向.
rec:用于存储命中信息的容器类(bool,t等)
我的函数可以访问平面:
点:定义平面
法线的点:定义平面的法线
使用不带有g ++ 4.6.1 double的std::abs()函数变体时std,不会给出警告或错误.
#include <algorithm>
#include <cmath>
double foobar(double a)
{
return abs(a);
}
Run Code Online (Sandbox Code Playgroud)
这个版本的g ++似乎是通过其中一个包含来引入全局命名空间的double变体.这似乎现在标准允许(参见此问题),但不是必需的.abs()algorithm
如果我使用不将double变量abs()引入全局命名空间的编译器(例如g ++ 4.2)编译上述代码,则会报告以下错误:
warning: passing 'double' for argument 1 to 'int abs(int)'
Run Code Online (Sandbox Code Playgroud)
我如何强制g ++ 4.6.1和其他将函数拉入全局命名空间的编译器发出警告,以便在与其他编译器一起使用时可以防止错误?
不知怎的,我从涉及库函数abs()的方程中得到了错误的结果。这是我存在问题的代码:
main.cpp -------------------------------------
#include <iostream>
#include <cmath>
#include "test999.h"
using namespace std;
int main()
{
float n = 11;
ak r;
r = test(n);
printf("\n");
for(int i = 0; i < n; i++){
printf("r.yp[%d] = %3.7f \n", i, r.yp[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test999.h ------------------------------------------
struct ak{
float yp[20];
};
ak test(int n){
float u[] = {0, 0, 0, 0, 0, 0, 0, 0.5, 4.5, 35, 10, 25, 40, 55};
ak r;
float a, b;
for(int i = 0; i …Run Code Online (Sandbox Code Playgroud) 结果std::abs(0.5f)是0因为浮点数没有过载。为什么?我正在使用 G++。