相关疑难解决方法(0)

为什么`abs()`的实现方式有所不同?

在过去的几周中,我的代码中出现了一个令人沮丧的错误。我的代码可以完全按照我的计算机上的预期运行,但是一旦将其移植到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个星期的时间,所以可以想像我刚才有点咸...

c++ gcc compilation clang

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

射线平面交叉怎么办?

如何计算光线与平面之间的交点?我一直在访问我能找到的每个可能的网站,这是我迄今为止取得的成就:

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等)

我的函数可以访问平面:
点:定义平面
法线的点:定义平面的法线

c++ raytracing

14
推荐指数
3
解决办法
3万
查看次数

使用abs()避免编译器问题

使用不带有g ++ 4.6.1 doublestd::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和其他将函数拉入全局命名空间的编译器发出警告,以便在与其他编译器一起使用时可以防止错误?

c++

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

与 abs() 的方程给出了错误的答案 (gcc/g++)

不知怎的,我从涉及库函数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)

c++

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

为什么 std::abs() 不适用于浮点数

结果std::abs(0.5f)0因为浮点数没有过载。为什么?我正在使用 G++。

c++ floating-point absolute-value c++-standard-library

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