色々な言語でとにかく0.1+0.2をやってみた

# 概要

複数の言語で、数値を0.1と0.2を(浮動小数点な数値と類されるもの)足してみます。
計算誤差のことを何も考えずに足し算をして、一般的と考えられるコンソール表示用の関数(print系のもの)で表示させた時の様子を観察してみることが目的です。
数値計算の際には実際は専用のライブラリ・関数群を使いますが、それらを使わずにナイーブに数値を書くとどうなるかしら、ということを観察しています。

試した環境は、macOS 10.13.6です。

## 1ライナーでためせるもの

### JavaScript(Node)

```bash
$ node -v
v7.7.1
$ node -e 'console.log(0.1+0.2)'
0.30000000000000004
```

### Ruby

```bash
$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]
$ ruby -e 'puts(0.1+0.2)'
0.30000000000000004
```

### Python(CPython)

```bash
$ python --version
Python 2.7.10
$ python -c 'print(0.1+0.2)'
0.3
```

```
$ python
Python 2.7.10 (default, Oct  6 2017, 22:29:07) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1+0.2
0.30000000000000004
```


### Perl(Perl5)

```bash
$ perl -version | grep 'This'
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
$ perl -e 'print(0.1+0.2)'
0.3
```

### PowerShell Core

```
$ pwsh -v
PowerShell v6.0.4
$ pwsh -C 'echo (0.1+0.2)'
0.3
```

### Scheme(Gauche)

```
$ gosh -V
Gauche scheme shell, version 0.9.6 [utf-8,pthreads], x86_64-apple-darwin17.7.0
$ gosh -e '(print (+ 0.1 0.2))'
0.30000000000000004
```

### awk

```
$ awk -version
awk version 20070501
$ awk 'BEGIN{print(0.1+0.2)}'
0.3
```

### Julia

```bash
$ /Applications/Julia-1.0.app/Contents/Resources/julia/bin/julia -v
julia version 1.0.0
$ /Applications/Julia-1.0.app/Contents/Resources/julia/bin/julia -e 'println(0.1+0.2)'
0.30000000000000004
```

### zsh

```zsh
$ zsh --version
zsh 5.3 (x86_64-apple-darwin17.0)
$ zsh -c 'echo $((0.1+0.2))'
0.30000000000000004
```

### emacs-lisp

```bash
$ emacs --version
GNU Emacs 22.1.1
$ emacs --batch --eval '(print (+ 0.1 0.2))'

0.30000000000000004
```

### lua

```bash
$ lua -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
$ lua -e 'print(0.1+0.2)'
0.3
```

### R

```bash
$ /Library/Frameworks/R.framework/Resources/bin/R --version | grep "R version"
R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
$ $ /Library/Frameworks/R.framework/Resources/bin/R -q -e '0.1+0.2'
> 0.1+0.2
[1] 0.3
```
## 1ライナー以外

### Swift

```
$ swift 
Welcome to Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1). Type :help for assistance.
  1> print(0.1+0.2)
0.30000000000000004
```

### Java

```
$ java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment Corretto-8.202.08.2 (build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM Corretto-8.202.08.2 (build 25.202-b08, mixed mode)
$ cat FloatingPointError.java 
```
```java

public class FloatingPointError {
	public static void main(String[] args) {
		System.out.println("" + (0.1+0.2));
	}
}
```
```bash
$ java FloatingPointError
0.30000000000000004
```

### C (Clang, Apple LLVM)

```bash
$ cc -v
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ cat floating_point_error.c
```
```c
#include <stdio.h>

int main() {
	printf("%f\n", 0.1 + 0.2);
}
```
```bash
$ cc floating_point_error.c
$ ./a.out 
0.300000
```

### C# (on Mono)

```bash
$ mcs --version
Mono C# compiler version 4.8.0.0
$ cat floaterror.cs 
```
```c#
using System;
class FloatError
{
    static void Main() 
    {
        System.Console.WriteLine("" + (0.1+0.2));
    }
}
```
```
$ mcs floaterror.cs 
$ mono floaterror.exe 
0.3
```

### Go

```bash
$ go version
go version go1.10.3 darwin/amd64
$ cat float_error.go 
```
```go
package main

import (
	"fmt"
)

func main() {
	fmt.Print(0.1 + 0.2)
}
```
```bash
$ go build float_error.go
$ ./float_error 
0.3
```

### Haskell

```bash
$ ghc -V
The Glorious Glasgow Haskell Compilation System, version 8.4.3
$ cat floaterror.hs 
```
```haskell
a = 0.1 + 0.2
main = do
  print a
```
```bash
$ runghc floaterror.hs 
0.30000000000000004
```

### Numbers

<img width="201" alt="スクリーンショット 2019-05-05 13.03.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/f4b26ec4-3836-8d72-5b15-f06dc02772a4.png">


デフォルトのセルの設定では下記の通りです。

<img width="234" alt="スクリーンショット 2019-05-05 12.56.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/1993ee20-f524-bb51-87ca-78f1d4a2acea.png">

<img width="135" alt="スクリーンショット 2019-05-05 12.56.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/86853f1b-7c73-6868-b94f-c017e2f1b6b5.png">

桁数を増やしてみると

<img width="281" alt="スクリーンショット 2019-05-05 13.02.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/802d9b84-5473-0e5a-67d7-a5dc69bed912.png">

<img width="254" alt="スクリーンショット 2019-05-05 13.02.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6ce9f6d8-a5ea-cef9-cb42-b8504741465a.png">


## 関連

このエントリは、次のエントリと関連があります。

- [色々な言語でとにかく0.0で割ってみた](https://qiita.com/hrkt/items/0c44a950e07ff8e66bd0)