1
0

More than 1 year has passed since last update.

AtCoderBeginnerContest113でつまずいた(absの戻り値の違い)

Posted at

経緯+つまずいたポイント

C++に関しては初心者で、文法の勉強を兼ねてAtCoderに挑戦していました。
ABC113のB問題に取り掛かっていたところ、合っているはずのコードが何故かWAとなってしまいます。

WAとなったコード

#include <iostream>
#include <bits/stdc++.h>

int main()
{
    int N, T, A;
    std::cin >> N >> T >> A;

    std::vector<int> H(N);
    for (int i = 0; i < N; i++){
        std::cin >> H[i];
    }

    double minValue = 710;
    int minIndex = 0;
    for (int i = 0; i < N; i++){
        double tmp = abs(A - (T - H[i] * 0.006));
        if (tmp < minValue){
            minValue = tmp;
            minIndex = i;
        }
    }

    std::cout << minIndex + 1 << std::endl;
    return 0;
}

1,2時間ほど考えられる箇所を修正しては戻し、修正しては戻しを繰り返したところ
「abs」が意図した出力になっていないことが分かりました。

std::absとしないといけないらしい?

例えばabs(-2.3)とすると戻り値は2となるようです。(小数点以下切り捨て?)
std::abs(-2.3)はちゃんと2.3になる。。。
ただしこれはGCCのときのみで、Clangだとどちらも2.3になりました。

それぞれの出力をまとめた

①GCC 9.2.1(abs)

#include <iostream>

int main(){
  double value = -2.3;

  std::cout << abs(value) << std::endl; //出力->2
  return 0;
}

②GCC 9.2.1(std::abs)

#include <iostream>

int main(){
  double value = -2.3;

  std::cout << std::abs(value) << std::endl; //出力->2.3
  return 0;
}

③Clang 10.0.0(abs)

#include <iostream>

int main(){
  double value = -2.3;

  std::cout << abs(value) << std::endl; //出力->2.3
  return 0;
}

④Clang 10.0.0(std::abs)

#include <iostream>

int main(){
  double value = -2.3;

  std::cout << std::abs(value) << std::endl; //出力->2.3
  return 0;
}

引き続き詳細は調査

とりあえず備忘録として記事にしましたが
いまいちわからない箇所が多いので、追記・修正していきたいと思います。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0