タグ

floatに関するrydotのブックマーク (5)

  • 直列加算と並列加算でdoubleの足し算の結果が変わる話 - きしだのHatena

    Javaに限った話ではないのだけど、Javaで並列加算が気軽にできるようになったので、気に留めておいたほうがいい話。 まず、次のようなコードを動かしてみます。 public static void main(String[] args){ double[] data = { 1.234E80, -1.234E80, 2, 3}; System.out.println(Arrays.stream(data).sum()); System.out.println(Arrays.stream(data).parallel().sum()); } 1.234×10^80と-1.234×10^80という、桁が大きくて符号の違う数を並べて、そのあとに2と3という1桁の数値を置いています。 これらを加算すると、1.234×10^80と-1.234×10^80は符号が違うだけなので、当然結果は0になります

    直列加算と並列加算でdoubleの足し算の結果が変わる話 - きしだのHatena
  • 浮動小数点数型と誤差

    有限桁 C言語で扱える実数値は,2進数の有限小数で表された数値である.例えば次のようなものである. 1.5(10) = 1.1(2) 3.25(10) = 11.01(2) 理論的には小数が無限に続く値でも,そのうちの有限個の桁数でその値を表すしかない. 例えば,0.1 を2進数の小数で表すと 0.1(10) = 0.000110011001100110011...(2) と無限に続くが,コンピュータの内部では有限桁で丸められている. このような場合には,当の値ではなく,近似値でしか表すことができない. 指数表記(浮動小数点表記) 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 1234567890000000000000

    浮動小数点数型と誤差
  • 80 bit float number problem

    x86における 浮動小数点演算の精度の制御と、 80bit 浮動小数点演算問題 たけおか update: 2023/NOV/02 初出: 2010/NOV/20 0.はじめのはじめに みんな大好き Intel x86, AMD 64の浮動小数点演算のアーキテクチャは、 8087時代からの80bit演算に起因し、IEEE 754から逸脱するという欠点があった。 だが、今では、 gcc は、暗黙のうちに、SIMD(SSE,AVXなど)演算器を使用するコードを 生成するようになり、 SIMDユニットにて浮動小数点演算することで、 80bit演算由来の問題が、解消されるようになっている。 ではあるものの、この文書は、延々と80bit起因の問題について述べている。 現在も、8087由来の、x86伝統の内部80bit演算はCPU内には健在である。 80bit演算の害を体験したい場合は、 gccのオプシ

  • 浮動小数点演算ではまった話 - bkブログ

    浮動小数点演算ではまった話 浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。 パーセンテージの計算 簡単な C のプログラムでパーセンテージを計算しようと思い、 次のようなコードを書きました。 int x, y; ... int a = (double)x / y * 100; int a = x * 100 / y としないのは、 x が大きい場合に x * 100 が オーバーフローを起こす (INT_MAX を越える) ためです。 このコードは一見、期待通りに動いていたのですが、 しばらく使っていると、手元の環境では x = 53, y = 100 のときに a は 53 ではなく 52 になることに気づきました。 これは次の理由によります。 式の最初の (double)53 / 10

  • マシンの中のリアル : Dの浮動小数点数 - プログラミング言語 D (日本語訳)

  • 1