# Conversions from Floating-Point Types

**Visual Studio 2015**

For the latest documentation on Visual Studio 2017 RC, see Visual Studio 2017 RC Documentation.

A **float** value converted to a **double** or `long double`

, or a **double** converted to a `long double`

, undergoes no change in value. A **double** value converted to a **float** value is represented exactly, if possible. Precision may be lost if the value cannot be represented exactly. If the result is out of range, the behavior is undefined. See Limits on Floating-Point Constants for the range of floating-point types.

A floating value is converted to an integral value by first converting to a **long**, then from the **long** value to the specific integral value. The decimal portion of the floating value is discarded in the conversion to a **long**. If the result is still too large to fit into a **long**, the result of the conversion is undefined.

**Microsoft Specific**

When converting a **double** or `long double`

floating-point number to a smaller floating-point number, the value of the floating-point variable is truncated toward zero when an underflow occurs. An overflow causes a run-time error. Note that the Microsoft C compiler maps `long double`

to type **double**.

**END Microsoft Specific**

The following table summarizes conversions from floating types.

### Conversions from Floating-Point Types

From | To | Method |
---|---|---|

float | `char` | Convert to long; convert long to `char` |

float | short | Convert to long; convert long to short |

float | long | Truncate at decimal point. If result is too large to be represented as long, result is undefined. |

float | unsigned short | Convert to long; convert long to `unsigned` short |

float | `unsigned long` | Convert to long; convert long to `unsigned` long |

float | double | Change internal representation |

float | `long double` | Change internal representation |

double | `char` | Convert to float; convert float to `char` |

double | short | Convert to float; convert float to short |

double | long | Truncate at decimal point. If result is too large to be represented as long, result is undefined. |

double | unsigned short | Convert to long; convert long to unsigned short |

double | `unsigned long` | Convert to long; convert long to `unsigned` long |

double | float | Represent as a float. If double value cannot be represented exactly as float, loss of precision occurs. If value is too large to be represented as float, the result is undefined. |

`long double` | `char` | Convert to float; convert float to `char` |

`long double` | short | Convert to float; convert float to short |

`long double` | long | Truncate at decimal point. If result is too large to be represented as long, result is undefined. |

`long double` | unsigned short | Convert to long; convert long to `unsigned` short |

`long double` | `unsigned long` | Convert to long; convert long to `unsigned` long |

`long double` | float | Represent as a float. If double value cannot be represented exactly as float, loss of precision occurs. If value is too large to be represented as float, the result is undefined. |

`long double` | double | The long double value is treated as double. |

Conversions from **float**, **double**, or `long double`

values to `unsigned long`

are not accurate if the value being converted is larger than the maximum positive **long** value.