# Magnitude

We have been working with the direction of the magnetic field but what's its real magnitude? The number that the `magnetic_field` function reports are unit-less. How can we convert those values to Gauss?

The documentation will answer that question.

Section 2.1 Sensor characteristics - Page 10 - LSM303DLHC Data Sheet

The table in that page shows a magnetic gain setting that has different values according to the values of the GN bits. By default, those GN bits are set to `001`. That means that magnetic gain of the X and Y axes is `1100 LSB / Gauss` and the magnetic gain of the Z axis is `980 LSB / Gauss`. LSB stands for Least Significant Bits and the `1100 LSB / Gauss` number indicates that a reading of `1100` is equivalent to `1 Gauss`, a reading of `2200` is equivalent to `2 Gauss` and so on.

So, what we need to do is divide the X, Y and Z values that the sensor outputs by its corresponding gain. Then, we'll have the X, Y and Z components of the magnetic field in Gauss.

With some extra math we can retrieve the magnitude of the magnetic field from its X, Y and Z components:

``````#![allow(unused)]
fn main() {
let magnitude = (x * x + y * y + z * z).sqrt();
}``````

Putting all this together in a program:

``````#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*, I16x3};
use m::Float;

#[entry]
fn main() -> ! {
const XY_GAIN: f32 = 1100.; // LSB / G
const Z_GAIN: f32 = 980.; // LSB / G

let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();

loop {
let I16x3 { x, y, z } = lsm303dlhc.mag().unwrap();

let x = f32::from(x) / XY_GAIN;
let y = f32::from(y) / XY_GAIN;
let z = f32::from(z) / Z_GAIN;

let mag = (x * x + y * y + z * z).sqrt();

iprintln!(&mut itm.stim, "{} mG", mag * 1_000.);

delay.delay_ms(500_u16);
}
}``````

This program will report the magnitude (strength) of the magnetic field in milligauss (`mG`). The magnitude of the Earth's magnetic field is in the range of `250 mG` to `650 mG` (the magnitude varies depending on your geographical location) so you should see a value in that range or close to that range -- I see a magnitude of around 210 mG.

Some questions:

Without moving the board, what value do you see? Do you always see the same value?

If you rotate the board, does the magnitude change? Should it change?